2004-02-02
_ 朝
頭いたい。ゆれる。仕事休めばよかったかもしれん。
_ ほげ
下記のようなコードを Visual C++ 6.0 でリリースビルドして実行すると sprintf() を実行したところで buffer overrun で落ちるらしい。へえ。
#include <stdio.h> #include <stdlib.h> int main( int ac, char** av ) { int i; char buf[8]; i = 1; sprintf( buf, "%f", i ); return 0; }
コンパイラの警告レベルを最上にすればコンパイラが怒ってくれるんじゃないかと思ったがダメだった。
F:\s.miwa\work\study\c>cl -W4 t.c Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8804 for 80x86 Copyright (C) Microsoft Corp 1984-1998. All rights reserved. t.c t.c(6) : warning C4100: 'av' : 引数は関数の本体部で 1 度も参照されません。 t.c(6) : warning C4100: 'ac' : 引数は関数の本体部で 1 度も参照されません。 Microsoft (R) Incremental Linker Version 6.00.8447 Copyright (C) Microsoft Corp 1992-1998. All rights reserved. /out:t.exe t.obj
gcc には怒られた。
rin@sakura[~/tmp]% gcc -Wall t.c t.c: In function `main': t.c:12: warning: double format, different type arg (arg 3) rin@sakura[~/tmp]%
ほぅ、gcc って 、わざわざそんな所まで見てくれるのね。
Visual Studio .NET な環境では /GS オプションで幸せになれるらしいけど詳細忘れたし試す環境がない....。コンパイル時点では引っかからないかな。