2006-11-15

gcc の警告オプション -Wall と -W

先日、友人と clmemo@aka: Binary Hacks がらみで、gcc の Warning flag をどうしてるか? という話になった。友人は、とりあえず -Wall オプションを付けているという。なるべく警告の出ないコードを書きたいものだよね、と応えた後、ぼくはかう続けた。「でも、-W オプションを付けると、-Wall よりも詳しい警告が出るよ」友人は驚いていた。

せっかくなので、ちょっとここでまとめておかう。

-Wall オプション

gcc の info を読むと、-Wall オプションは、以下のオプションを全て指定したものに等しいとある (gcc 3.3.4 から引用)。

  • -Wno-import
  • -Wchar-subscripts
  • -Wcomment
  • -Wformat
  • -Wno-format-y2k
  • -Wno-format-extra-args
  • -Wno-format-zero-length
  • -Wformat-nonliteral
  • -Wformat-security
  • -Wformat=2
  • -Wnonnull
  • -Wimplicit-int
  • -Wimplicit-function-declaration
  • -Werror-implicit-function-declaration
  • -Wimplicit
  • -Wmain
  • -Wmissing-braces
  • -Wparentheses
  • -Wsequence-point
  • -Wreturn-type
  • -Wswitch
  • -Wswitch-default
  • -Wswitch-enum
  • -Wtrigraphs
  • -Wunused-function
  • -Wunused-label
  • -Wunused-parameter
  • -Wunused-variable
  • -Wunused-value
  • -Wunused
  • -Wuninitialized
  • -Wunknown-pragmas
  • -Wstrict-aliasing

-Wall は、これらの「問題があると (一般に) 思われる構文」に対して警告を出す。

つまり -Wall は、一般には問題ないとされる構文 (constructions that users generally do not consider questionable) に対しては警告を出さない。

-W オプション

-W オプションは、-Wall では無視されたけど、時折チェックが望まれるであらう項目に対して、警告を出す (ぼくは、最近「-W -Wall」とオプションを付けている)。

info に書かれている -W オプションのチェック項目は以下の通り (info には、もう少し詳しい説明と例文があるので、興味のある方はどうぞ info もお読みあれ)。

  • 関数の戻り値のあり/なしが定まっていない場合、警告を出す。
  • 「式」や「カンマ式の左辺」に副作用がない場合、警告を出す。
  • 符号なしの値を、<>= で 0 と比較している場合、警告を出す。
  • x<=y<=z のような比較式に対して警告を出す。
  • static のような記憶クラス指定子が宣言の最初でないところにある場合、警告を出す。
  • 関数の戻り値タイプが const のような型修飾子の場合、警告を出す。
  • -Wall 若しくは -Wunused を一緒に指定すると、未使用の引数を警告する。
  • 符号付きの値と符号なしの値を比較して、符号付きの値が符号なしに変換されると、正しくない結果を得ることがあるので、警告を出す。
  • 集合型が部分的に中括弧で初期化されている場合、警告を出す。
  • 集合型の初期化子が全てのメンバーを初期化していない場合、警告を出す。

あとがき

Warning flag の内容は、gcc のバージョンによって変わるかもしれない (今回の info は gcc 3.3.4 を訳出)。この記事の訳は、参考程度に届めて欲しい。詳しくは、各自の gcc の info を参照のこと。

gcc には、この他にも様々な Warning オプションがある。ぼくは、到底追いきれてないけれど、気になる方は info に当たってみると楽しいでせう。

※ 私は C にそれほど詳しくないので、誤りもあるかもしれません。誤りを見つけたら、ドンドン指摘して下さるとありがたいです。

No comments:

Post a Comment