最新

meta‘s blog

2012-03-11 C言語

GCC と LLVM Clang 動作の違い (戻り値を省略したreturn)

FreeBSD ではシステムのデフォルトコンパイラを GCC から LLVM Clang に置き換える方針なのだけど、 9.0-RELEASE 時点ではまだ完全に移行したわけではなく、ビルドできない port も多数存在する。

GCC ではコンパイルできて、LLVM Clang ではコンパイルできないコードの例として、 以下のようなものがある。

#include <stdio.h>
int main(void)
{
       return;
}

このようなコードは GCC では warning だが、Clang では error となる。

$ gcc -Wall returntest.c -o returntest-gcc
returntest.c: In function 'main':
returntest.c:5: warning: 'return' with no value, in function returning non-void
$ clang returntest.c -o returntest-clang
returntest.c:5:2: error: non-void function 'main' should return a value [-Wreturn-type]
        return;
        ^
1 error generated.

このコードを Clang でコンパイルできるようにするには、int 型の関数に int 型の戻り値を与えてやる必要があるのだけど、 そもそも GCC でコンパイルしたときに、省略された戻り値に何が補われているのかわからないと困る。ので実際に実行して調べてみたところ…

$ ./returntest-gcc; echo $?
255

255らしい。ということで、GCC ではコンパイルできて Clang ではコンパイルできない上記のコードは、

--- returntest.c.orig   2012-03-11 01:29:07.981782622 +0900
+++ returntest.c        2012-03-11 01:29:13.600783049 +0900
@@ -2,5 +2,5 @@

 int main(void)
 {
-       return;
+       return 255;
 }

と書き換えてやるといいのかな。本当の意図はプログラムを書いた人じゃないとわからないけど。