先日、友人と 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