プログラマ ずんべ の日記

zunbe

プログラマ ずんべ の日記
プログラマ ずんべ の日記

探し物は見つかりましたか? サイト内検索を試してください。

胎教音楽 胎教音楽 そろそろ検索の不具合をなんとかしてよ→マイクロソフト そろそろ検索の不具合をなんとかしてよ→マイクロソフト

2005/09/24

【プログラミング】コンパイル時の警告レベル

学校などでC言語を習うと、たいていこんな風に教わる。

 ・コンパイル時に出る警告は無視していい。

これは、とんでもない話である。
たとえば、以下の様なプログラム。

--
#include <stdio.h>
#include <io.h>
void main(void);
void main(void)
{
  FILE *fp;
  fp = fopen("hoge.txt", "r");
    :
  close(fp);
}
--

このプログラムは、バグがある。
本来、fclose() を呼び出すべきところで close() を呼び出している。

VC++ で、/W 系の警告オプションを指定して、このプログラムをコンパイルすると以下の警告が出力される。

 ・close() の第1引数が実引数と仮引数で異なっている。

このソースのままコンパイル、リンクしても、もちろん、正常に動作しない。
アクセス例外を引き起こす可能性もある。
無視してはならない警告である。

ソフトウェアを開発する場合、可能な限り厳しい警告オプションを設定し、可能であれば警告をエラーとみなすオプションを設定するべきである。
VC++なら、以下のオプションだ。

 /W4 /WX

/W4 は警告レベル最大のオプション、/WX は警告をエラーとみなすオプションである。

初心者にこういう話をすると、必ず眉をひそめてこう言う。

 「警告は無視していいのではないですか?」

たしかに、学校ではそう教わったかもしれない。
しかしそれは、学校の授業で「とりあえず、無視していい」というだけの話であって、実務では許されない。

警告を無視してコンパイルすれば、後で自分が泣きを見る事になる。
動いているように見せかけて、実はシステムを破壊しながら動作するわけだから、動作中にクラッシュしたとしても、原因究明に余計な時間を費やす事になる。

そもそも、警告を無視しようとする発想がわからない。
コンパイラが、「それ間違ってるんじゃないの?」と、障害が発生する可能性を指摘してこれているのである。
上記の様なミスは、目で追って見つけられるものではない。
コンパイラがミスを見つけてくれるのである。
これを無視するなんて、とんでもない話だ。
警告は、原則としてエラーであると考えて、すべて排除すべきである。

ちなみに、この説明をして、「警告を排除しろ」と指示すると、たいていの初心者は以下の様にプログラムを修正する。

--
  close((int)fp);
--

困ったものである。


Microsoft Visual Studio .NET Professional Version 2003
Microsoft Visual Studio .NET
Professional Version 2003



このエピソードはいかがでしたか?

投稿者 zunbe : 2005/09/24 08:49:11


トラックバック 〔http://blog.zunbe.com/mt/mt-tb.cgi/5〕

コメント

コメントしてください






保存しますか?


スパム対策:
この入力フィールドに「109」と入力してください。


プログラマ ずんべ の日記:ずばヒット アマゾン