たとえば、こんな感じのC言語のプログラムなのですが[E:coldsweats01]
% cat aho.c
#include <stdio.h>
int main( int argc, char* argv[] )
{
int aho = aho;
printf("%d\n", aho);
return aho;
}
int aho = aho はタイプミスだったんですけど…。本当は、int aho = argc; と書いたつもりだった、みたいな。
% gcc -Wall aho.c
なんとまぁ~warningメッセージさえも出ません。コンパイラはGCC。
% ./a.out; echo $?
24
24
という感じで、無意味に実行できてしまいます。
えー!!そうだったんだと、おどろきました、あきれました[E:shock]
変数宣言のときの初期値代入で、右辺と左辺が同じでも、まったく何も言われないとは。
☆
デバイスドライバの中で、こういうタイプミスをしていて、kernel panicしました。
ポインタがNULLでした。
clangに-Wallを渡すと未初期化で警告されます。
返信削除% clang -v
FreeBSD clang version 3.1 (branches/release_31 156863) 20120523
Target: x86_64-unknown-freebsd9.0
Thread model: posix
% clang -Wall aho.c
aho.c:4:13: warning: variable 'aho' is uninitialized when used within its own
initialization [-Wuninitialized]
int aho = aho;
~~~ ^~~
1 warning generated.
このケースは、フロー解析がかなり厄介そうですね。
��構造体の要素と同じ名前のローカル変数名のつもりが、、なバグで私もやらかしたことがあります)