Cに推奨されるgcc警告オプション[クローズ]


83

-Wall以外に、他にどのような警告が役立つと思われますか?

http://gcc.gnu.org/onlinedocs/gcc-4.3.2/gcc/Warning-Options.html

回答:


48

私は日常的に使用します:

    gcc -m64 -std=c99 -pedantic -Wall -Wshadow -Wpointer-arith -Wcast-qual \
        -Wstrict-prototypes -Wmissing-prototypes

このセットは、慣れていない人(初めてこれらのフラグを使用してコードをコンパイルする人)に多くのことをキャッチします。それが私に問題を与えることはめったにありません(-Wcast-qualは時々迷惑ですが)。


1
最近、-Wdeclaration-after-statementMSVC(基本的にはC89コンパイラ)が処理できないコードを検出するために、 ' 'を追加する必要があることがわかりました。'これは迷惑です。' -Wextra'を追加すると、他の問題も見つけることができます。
Jonathan Leffler 2010

2
また、-O3または同様のものを追加することをお勧めします。コードが最適化された場合にのみ生成される警告があります。
Jonathan Leffler 2012年

3
gcc docによると、警告を見つけるには-O2が最適です。-O3が-O2を意味するのか、それともさらに警告を生成できるようにするのかはわかりません。
Offirmo 2012

3
64ビット環境でない場合は、-m64をスキップしてください。
Tor Klingberg 2013

1
との両方-m32 -m64(もちろん別々の実行で)使用するprintf()と、使用方法とscaf()変換仕様のさまざまなバグからの保護が強化されます。
ジョナサンレフラー2014年

40

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

1
-Wfloat-equalエイリアスに追加されました。ありがとうマーク
pmg 2009年

4
少なくとも最近のバージョンのgccでは、によって暗示される-Wstrict-aliasing=2警告レベルが実際に低くなることに注意してください。-Wstrict-aliasing=3-Wall
nwellnhof 2015年

15

私は-Werrorが好きです。コード警告を無料に保ちます。


21
-Werrorがないと、他のすべての警告オプションは無意味です。警告をエラーとして扱うことは、警告を確実に解決する唯一の方法です。それらが単なる警告である場合、開発者はそれが無効であると確信しているので、それを残すことを決定するかもしれません。それは本当かもしれませんが、次の開発者は、他のすべての人の間でそれを見なかったため、またはそれがもう1つの警告であるため、彼が導入した警告を修正しません。
クリストフプロヴォ

6
私は多くの時間が、私はむしろちょうど最初にコンパイル作業コピーを取得したいので、クリストフに反対、その後のエラーに対処します。
yktula 2010

9
なぜそれが魅力的であるかは理解できますが、作業コピーがある場合は、「機能する」ため、そのままにしておく可能性が高くなります。このリスクは、警告を修正するための時間を残すよう上司を説得する必要がある企業環境ではさらに高くなります。
JesperE 2010

2
#warning使用することの良い副作用を取り除くことを検討し-Werrorます。
JesperE 2013

3
-Werrorビルドでデフォルトで使用しないオープンソースのもので作業している場合、警告はコンパイラバージョンによって変わるため、異なるコンパイラバージョンを使用しているパッケージャを悩ませます。警告のないコードが他の誰かに警告を表示することがあります。それから彼らはそれをオフにするためにあなたのビルドシステムを掘り下げる必要があります。
Spudd86 2013

15

私は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-プロトタイプ
-欠落-プロトタイプ

5
-ansi -pedantic -std = c99を同時に使用できますか?-ansiはc89とほぼ同じものではありませんか?もしそうなら、それはc99フラグでどのように機能しますか?
ヨハン

2
@ Johan-できますが、最近わか​​ったように、実際には必要ありません。-ansiは-std = <default>を意味するので、実際には-std = c99 -pedanticと言うだけで、まったく同じ効果を得ることができます。ドキュメントの効果のためだけに、とにかくそれを使用する傾向があります。「このコードはANSI規格(衒学的!)で、標準のC99を使用しています」と書かれているように感じます。その直後に、通常は-Wno-long-longまたは同様のものがあります... ANSI規格の例外。
トム

9

使用しているGCCバージョンのマニュアルを入手し利用可能なすべての警告オプションを見つけてから、やむを得ない理由があるものだけを非アクティブ化します。(たとえば、変更できないサードパーティのヘッダーを使用すると、多くの警告が表示されます。)これらの理由を文書化します。(Makefile内、またはこれらのオプションを設定した場所で。)定期的に、およびコンパイラーをアップグレードするたびに、設定を確認してください。

コンパイラはあなたの友達です。警告はあなたの友達です。コンパイラーに、潜在的な問題についてできるだけ多くの機会を与えてください。


1
参考までに、マニュアルには警告の包括的なリストは1つもありません。ただし、そのようなリスト、それらを生成するために使用されるツールとともに、ここで見つけることができます。
カイルストランド

5

私も使用します:

-Wstrict-overflow = 5

整数のオーバーフロー動作に依存するコードを記述した場合に発生する可能性のある厄介なバグをキャッチするため。

そして:

-ウェクストラ

これにより、いくつかのオプションも有効になります。ただし、ほとんどはC ++用です。


4
-Wextraは-Wの新しい名前のようです(これもまだサポートされています)
Sard

2

私は通常、「-W -Wall -ansi -pedantic」を使用してコンパイルします。これにより、コードの品質と移植性を最大限に高めることができます。


3
ただのメモ-ansiは-std = c99をオーバーライドします
Sard

2
-ansiは-std = c89を使用することと同等ではありませんか?
helpermethod 2010

2

-pedantic -Wall -Wextra -Wno-write-strings -Wno-unused-parameter

「私をたくさん傷つける」モードでは、-Wno ..を省略します。

特にC ++では、コードの警告を無料にするのが好きです。Cコンパイラの警告は無視できることがよくありますが、多くのC ++警告はソースコードの根本的な欠陥を示しています。


3
ツールチェーンは文字列リテラルを読み取り専用メモリに自由に配置できるためです。
DevSolar 2010

3
なぜ-Wno-unused-parameter?それが実際の問題を指摘することはめったにありません(そしてそれを無効にすることによる正確な危険性を「めったに」ありません:ありそうもないバグは検出するのが最悪です)。たとえば、Foo(int dndu, int dndv) : dndu_(dndu), dndv_(dndu) {}->比較的見つけにくい場合にトリガーされる可能性があります。その警告に悩まされている場合は、単にパラメーターをコメントアウトする必要がありますfoo (int /*q*/)。これにより、コードの可読性も向上します。
セバスチャンマッハ

リファクタリング中に、ローカルで誤ってパラメーターをシャドウ
イング

1

-pedantic-エラー


2
@unexistインストールclang(LLVMプロジェクトのCコンパイラ)を試してからコンパイルすると-Weverything、マッハ楽しいコンパイルが実際にどのようになるかがわかります(警告のいくつかは完全に狂っていますが、技術的には正しいです)。
Mecki 2013年


1

-Wredundant-decls -Wnested-externs -Wstrict-prototypes -Wextra -Werror-implicit-function-declaration -Wunused -Wno-unused-value -Wreturn-type


1

今私は使用します:

-Wall -W -Wextra -Wconversion -Wshadow -Wcast-qual -Wwrite-strings -Werror

私はそのリストを主に「gccの紹介」という本から取り出し、次に防御プログラミングに関するUlrich Drepperの推奨事項(http://people.redhat.com/drepper/Defensive-slides.pdf)から取り出しました。

しかし、私は私のリストの背後に科学を持っていません、それはちょうど良いリストのように感じました。

/ヨハン


注:私はそれらの衒学的な旗は好きではありませんが....

注:-Wと-Wextraはほぼ同じものだと思います。


2
-Wconversionを使用し、コード内のさまざまなデータ型をテストして再構築するのに数時間を費やした後、-Wconversionを調査したので、一般的に使用することはお勧めしません。問題は、次のようなコードに関する警告を生成することです。chara = 5; char b = a-1; これはgcc4.3.2(Debian 4.3.2.-1.1)を使用しています
James Morris

1
-Wconversionの警告は、次の方法で削除できます(たとえば、上記のコメント)。chara = 5; char b =(char)(a --1); 角かっこに注意してください。
ジェームズモリス

1

私は一般的にただ使用します

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

1

初期化されていない変数に関する警告は-O、を指定しない限り機能しないため、リストに含めます。

-g -O -Wall -Werror -Wextra -pedantic -std=c99

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.