gcc の -Wall 以外の警告オプション
以前同僚の光成さんが、以下の warning オプションを使っていると書かれていたのが気になったので調べてみました。
-Wall -W -Wformat=2 -Wcast-qual -Wcast-align -Wwrite-strings -Wconversion -Wfloat-equal -Wpointer-arith
もし上記以外にも良さげなオプションがありましたら教えてください<(_ _)>
情報源
man と info と http://sugarpot.sakura.ne.jp/yuno/?gcc%2Fwarning 。
最初は日本語版の man だけを見ていたのですが、id:kazuhooku に info を見るべしと教わりました。
man も info もそうですが、日本語版は情報が少なかったりするので注意。
LANG=C man gcc
などとしましょう。
-Wformat=2
- Wformat には含まれていない format チェックを行う。
- Wformat -Wformat-nonliteral -Wformat-security -Wformat-y2k に等しい。
-Wcast-qual
ポインタが、型修飾子が削除されるようにキャストされる全ての場合に警告します。例えば const char ∗ を普通の char ∗ にキャストした場合に警告がなされます。
-Wcast-align
ポインタのキャストにおいて、そのターゲットに要求される境界条件が大きくなるようなキャストを全て警告します。例えば char ∗ が int ∗ へとキャストされると、整数が 2、あるいは 4 バイト境界でしかアクセスできないマシンにおいては警告が発せられます。
-Wwrite-strings
文字定数に対して、型 const char[length] を与え、非-const の char∗ ポインタへのアドレスのコピーに対して警告するようにします。
この警 告は、宣言とプロトタイプにおいて const の使用を非常に注意深くおこなっていさえすれば、文字列定数に書き込みをしそうなコードをコンパイル時に発見することを助けますが、そうでない場合は有害無益な
指定です。これが、我々がこの警告を ‘-Wall’ のリクエストに含めなかった理由です。
-Wconversion
同じ引数が与えられた時に、プロトタイプが存在する場合とプロトタイプが存在しない場合とで、異なった型変換を引き起こす場合について警告します。
これは固定小数点から浮動小数点への変換やその逆、デフォルトの動作と異なる固定小数点引数の幅や符号の有無の変換が含まれます。
-Wfloat-equal
浮動小数点の値を等価比較している場合に警告する。
-Wpointer-arith
関数型や void の “サイズ” に依存するものを全て警告します。
GNU Cは これらに対して、サイズ 1 を割り当てています。これは void ∗ ポインタと関数へのポインタにおける計算を簡便にするためです。
上記以外で気になったもの
-Winit-self
それ自身を使って初期化している未初期化変数について警告する。例えば以下のようなコードを警告する
int f() { int i = i; return i; }
-Wunsafe-loop-optimizations
ループ変数の境界についてコンパイラが何も仮定できないためループを最適化できない場合に警告する。
-Wpadded
構造体にパディングが含まれる場合に警告する。
警告オプションを適用した結果
7箇所くらい警告が出て、1つバグが見つかりました。やったね!
あとライブラリとして使わせていただいている鬼車とBoehm GC から大量の警告が。
警告とEmacs の問題
Emacs の M-x compile + next-error で warning までにもジャンプしてしまうんですが大量に警告が出ていると、本当のエラーに到達するのに何回もジャンプしなくてはいけなくてとても辛いです。
これって皆さんどう解決されているんでしょうか?(例えば自分のコードじゃないものが警告だしまくるとか)
compilation-error-regexp-alist-alist を上書きすれば良いのかなあ。
追記
moritaさんより -Wextra を教えていただきました。
-Wextra (This option used to be called -W. The older name is still sup- ported, but the newer name is more descriptive.) Print extra warn- ing messages for these events: ...
あ。-Wの名前が変わったんですね。
追記2
id:tasukchan さんから Senna の configure.ac を見ると良いとのコメントを頂きました。
-Wall -Wextra -Wno-unused-parameter -Wno-sign-compare -Wno-pointer-sign -Wno-missing-field-initializers -Wformat=2 -Wstrict-aliasing=2 -Wdisabled-optimization -Wfloat-equal -Wpointer-arith -Wdeclaration-after-statement -Wbad-function-cast -Wcast-align -Wredundant-decls -Winline ---param max-inline-insns-single=12000 ---param large-function-growth=28000 ---param inline-unit-growth=400