5
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

posted at

clangの最適化で動作が変わった

問題

下記のコードで、HelloWorldのどちらが出力されるのか考えてみてください。
場合によってはメモリリークしますが、とにかく標準出力に出てくるのは何かだけ考えてみてください。

出力されるのはHelloなのかWorldなのか
#include <stdio.h>
#include <stdlib.h>

static int* g_i = NULL;

static void PutsSomething() {
    if (g_i == NULL) {
        g_i = (int*)malloc(sizeof(*g_i));
        puts("Hello");
    } else {
        puts("World");
    }
}

int main(void) {
    g_i = NULL;
    PutsSomething();
    // free(g_i);
    return EXIT_SUCCESS;
}

動作確認結果

コンパイラ 最適化レベル 出力結果
gcc7.2 x86-64 -O0 Hello
gcc7.2 x86-64 -O1 Hello
gcc7.2 x86-64 -O2 Hello
clang5.00 x86-64 -O0 Hello
clang5.00 x86-64 -O1 World
clang5.00 x86-64 -O2 World

どうしてこうなった

分からない。
ちなみにfree()を書けばHelloが出力される。分からない。

参考

clangのアセンブラ出力確認

動作確認環境

  • [Wandbox]三へ( へ՞ਊ ՞)へ ハッハッ
    https://wandbox.org/
    どうやらclang-6.00でも起きる模様。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
5
Help us understand the problem. What are the problem?