ttt

getttyent

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

2012-04-05 23:58:08 | デジタル・インターネット

たとえば、こんな感じのC言語のプログラムなのですが

% 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

という感じで、無意味に実行できてしまいます。

えー!!そうだったんだと、おどろきました、あきれました
変数宣言のときの初期値代入で、右辺と左辺が同じでも、まったく何も言われないとは。

デバイスドライバの中で、こういうタイプミスをしていて、kernel panicしました。
ポインタがNULLでした。

20120405


1 コメント

コメント日が  古い順  |   新しい順
clangに-Wallを渡すと未初期化で警告されます。 (eguchi)
2012-07-03 06:02:54
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.

このケースは、フロー解析がかなり厄介そうですね。
(構造体の要素と同じ名前のローカル変数名のつもりが、、なバグで私もやらかしたことがあります)
返信する

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。