-Wall以外に、他にどのような警告が役立つと思われますか?
http://gcc.gnu.org/onlinedocs/gcc-4.3.2/gcc/Warning-Options.html
回答:
私は日常的に使用します:
gcc -m64 -std=c99 -pedantic -Wall -Wshadow -Wpointer-arith -Wcast-qual \
-Wstrict-prototypes -Wmissing-prototypes
このセットは、慣れていない人(初めてこれらのフラグを使用してコードをコンパイルする人)に多くのことをキャッチします。それが私に問題を与えることはめったにありません(-Wcast-qualは時々迷惑ですが)。
-O3
または同様のものを追加することをお勧めします。コードが最適化された場合にのみ生成される警告があります。
-m32
を -m64
(もちろん別々の実行で)使用するprintf()
と、使用方法とscaf()
変換仕様のさまざまなバグからの保護が強化されます。
2011-09-01現在、gccバージョン4.6.1
私の現在の「開発」エイリアス
gcc -std = c89 -pedantic -Wall \ -Wno-missing-braces -Wextra -Wno-missing-field-initializers -Wformat = 2 \ -Wswitch-default -Wswitch-enum -Wcast-align -Wpointer-arith \ -Wbad-function-cast -Wstrict-overflow = 5 -Wstrict-prototypes -Winline \ -Wundef -Wnested-externs -Wcast-qual -Wshadow -Wunreachable-code \ -Wlogical-op -Wfloat-equal -Wstrict-aliasing = 2 -Wredundant-decls \ -Wold-style-definition -Werror \ -ggdb3 \ -O0 \ -fno-omit-frame-pointer -ffloat-store -fno-common -fstrict-aliasing \ -lm
「リリース」エイリアス
gcc -std = c89 -pedantic -O3 -DNDEBUG -flto -lm
2009年11月3日現在
「開発」エイリアス
gcc -Wall -Wextra -Wformat = 2 -Wswitch-default -Wcast-align -Wpointer-arith \ -Wbad-function-cast -Wstrict-prototypes -Winline -Wundef -Wnested-externs \ -Wcast-qual -Wshadow -Wwrite-strings -Wconversion -Wunreachable-code \ -Wstrict-aliasing = 2 -ffloat-store -fno-common -fstrict-aliasing \ -lm -std = c89 -pedantic -O0 -ggdb3 -pg --coverage
「リリース」エイリアス
gcc -lm -std = c89 -pedantic -O3 -DNDEBUG --combine -fwhole-program -funroll-loops
-Wfloat-equal
エイリアスに追加されました。ありがとうマーク
-Wstrict-aliasing=2
警告レベルが実際に低くなることに注意してください。-Wstrict-aliasing=3
-Wall
私は-Werrorが好きです。コード警告を無料に保ちます。
#warning
使用することの良い副作用を取り除くことを検討し-Werror
ます。
-Werror
ビルドでデフォルトで使用しないオープンソースのもので作業している場合、警告はコンパイラバージョンによって変わるため、異なるコンパイラバージョンを使用しているパッケージャを悩ませます。警告のないコードが他の誰かに警告を表示することがあります。それから彼らはそれをオフにするためにあなたのビルドシステムを掘り下げる必要があります。
私はC ++から始めたので、CIの学習に切り替えたとき、肛門外であることを確認しました。
-fmessage-length = 0 -ansi -pedantic -std = c99 -エラー -壁 -ウェクストラ -Wwrite-strings -Winit-self -Wcast-align -Wcast-qual -Wpointer-arith -Wstrict-aliasing -Wformat = 2 -欠落-宣言 -Wmissing-include-dirs -Wno-unused-parameter -初期化されていません -Wold-style-definition -Wstrict-プロトタイプ -欠落-プロトタイプ
使用しているGCCバージョンのマニュアルを入手し、利用可能なすべての警告オプションを見つけてから、やむを得ない理由があるものだけを非アクティブ化します。(たとえば、変更できないサードパーティのヘッダーを使用すると、多くの警告が表示されます。)これらの理由を文書化します。(Makefile内、またはこれらのオプションを設定した場所で。)定期的に、およびコンパイラーをアップグレードするたびに、設定を確認してください。
コンパイラはあなたの友達です。警告はあなたの友達です。コンパイラーに、潜在的な問題についてできるだけ多くの機会を与えてください。
私も使用します:
-Wstrict-overflow = 5
整数のオーバーフロー動作に依存するコードを記述した場合に発生する可能性のある厄介なバグをキャッチするため。
そして:
-ウェクストラ
これにより、いくつかのオプションも有効になります。ただし、ほとんどはC ++用です。
私は通常、「-W -Wall -ansi -pedantic」を使用してコンパイルします。これにより、コードの品質と移植性を最大限に高めることができます。
-pedantic -Wall -Wextra -Wno-write-strings -Wno-unused-parameter
「私をたくさん傷つける」モードでは、-Wno ..を省略します。
特にC ++では、コードの警告を無料にするのが好きです。Cコンパイラの警告は無視できることがよくありますが、多くのC ++警告はソースコードの根本的な欠陥を示しています。
Foo(int dndu, int dndv) : dndu_(dndu), dndv_(dndu) {}
->比較的見つけにくい場合にトリガーされる可能性があります。その警告に悩まされている場合は、単にパラメーターをコメントアウトする必要がありますfoo (int /*q*/)
。これにより、コードの可読性も向上します。
-pedantic-エラー
clang
(LLVMプロジェクトのCコンパイラ)を試してからコンパイルすると-Weverything
、マッハ楽しいコンパイルが実際にどのようになるかがわかります(警告のいくつかは完全に狂っていますが、技術的には正しいです)。
今私は使用します:
-Wall -W -Wextra -Wconversion -Wshadow -Wcast-qual -Wwrite-strings -Werror
私はそのリストを主に「gccの紹介」という本から取り出し、次に防御プログラミングに関するUlrich Drepperの推奨事項(http://people.redhat.com/drepper/Defensive-slides.pdf)から取り出しました。
しかし、私は私のリストの背後に科学を持っていません、それはちょうど良いリストのように感じました。
/ヨハン
注:私はそれらの衒学的な旗は好きではありませんが....
注:-Wと-Wextraはほぼ同じものだと思います。
私は一般的にただ使用します
gcc -Wall -W -Wunused-parameter -Wmissing-declarations -Wstrict-prototypes -Wmissing-prototypes -Wsign-compare -Wconversion -Wshadow -Wcast-align -Wparentheses -Wsequence-point -Wdeclaration-after-statement -Wundef -Wpointer-arith -Wnested-externs -Wredundant-decls -Werror -Wdisabled-optimization -pedantic -funit-at-a-time -o
-Wfatal-errors
-Wdeclaration-after-statement
MSVC(基本的にはC89コンパイラ)が処理できないコードを検出するために、 ' 'を追加する必要があることがわかりました。'これは迷惑です。'-Wextra
'を追加すると、他の問題も見つけることができます。