2012年4月6日金曜日

これってwarningさえ出ないんだ!

たとえば、こんな感じの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でした。



20120405



1 件のコメント:

  1. 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.
    このケースは、フロー解析がかなり厄介そうですね。
    ��構造体の要素と同じ名前のローカル変数名のつもりが、、なバグで私もやらかしたことがあります)

    返信削除