LoginSignup
5

More than 5 years have passed since last update.

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

Posted at

問題

下記のコードで、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でも起きる模様。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5