前回のプログラムを別のコンパイラで。おまけに 0 について。

前回 char 型の %s 表記についてちょちょっとやったわけなんですが、

今回はそのプログラムを gcc ではなく、 llvm-gcc を使ってやってみたら動作が微妙に変わったので報告。


llvm については先日友人の話から聞いたものなのであまりよく知らないのですが、
使ってみようと思って使ったら動作変わったのでこれまた不思議!
使い方は普通の gcc と同じ...なのかな。

まずは、 gccllvm-gcc のバージョンでも

% gcc -v
Using built-in specs.
Target: i686-apple-darwin10
Configured with: /var/tmp/gcc/gcc-5666.3~6/src/configure --disable-checking --enable-werror --prefix=/usr --mandir=/share/man --enable-languages=c,objc,c++,obj-c++ --program-transform-name=/^[cg][^.-]*$/s/$/-4.2/ --with-slibdir=/usr/lib --build=i686-apple-darwin10 --program-prefix=i686-apple-darwin10- --host=x86_64-apple-darwin10 --target=i686-apple-darwin10 --with-gxx-include-dir=/include/c++/4.2.1
Thread model: posix
gcc version 4.2.1 (Apple Inc. build 5666) (dot 3)
% llvm-gcc -v
Using built-in specs.
Target: i686-apple-darwin10
Configured with: /var/tmp/llvmgcc42/llvmgcc42-2335.6~17/src/configure --disable-checking --enable-werror --prefix=/Developer/usr/llvm-gcc-4.2 --mandir=/share/man --enable-languages=c,objc,c++,obj-c++ --program-prefix=llvm- --program-transform-name=/^[cg][^.-]*$/s/$/-4.2/ --with-slibdir=/usr/lib --build=i686-apple-darwin10 --enable-llvm=/var/tmp/llvmgcc42/llvmgcc42-2335.6~17/dst-llvmCore/Developer/usr/local --program-prefix=i686-apple-darwin10- --host=x86_64-apple-darwin10 --target=i686-apple-darwin10 --with-gxx-include-dir=/usr/include/c++/4.2.1
Thread model: posix
gcc version 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.6)

微妙に違う・・・?という具合です。

では、まずは gcc の方から!
以下は実行結果のみを載せています。

str[0] = a
str[1] = s
str[2] = d
str[3] = 
str[4] = 
str[5] = 
str[6] = 
入力 -> asdf
str = asdf

ここはまあ、前回同様です。
では次に、 llvm-gcc で!

str[0] = a
str[1] = s
str[2] = d
str[3] = R
str[4] = 
str[5] = ?
str[6] = _
入力 -> asdf
str = asdf

はい、見事に動作が(微妙に)変わりました。
う〜ん。謎。これも調べたら分かるのだろうか・・・?

・・・その前に、llvm について調べてみないといけないと思いますが(汗



以下おまけ。

#include <stdio.h>

int main(){
	printf("(void*)0 == %ld\n",sizeof((void*)0));
	printf("0 == %ld\n",sizeof(0));
	printf("\"0\" == %ld\n",sizeof("0"));
	printf("'0' == %ld\n",sizeof('0'));
	return 0;
}

実行結果

(void*)0 == 8
0 == 4
"0" == 2
'0' == 4