web-dev-qa-db-ja.com

C / C ++コンパイラに最適なコンパイラ警告レベル?

異なるC/C++コンパイラーには、どのコンパイラー警告レベルをお勧めしますか?

gccとg ++を使用すると、デフォルトレベルの多くの問題を回避できます。私にとって最適な警告レベルは「-Wall」です。そして、私は常にそれが生成する警告のコードを修正して削除しようとします。 (論理的な優先順位ルールに括弧を使用することについての愚かなものでも、私が本当に 'if(x = y)'を意味していると言います)

Sun CC、aCC(HPUX?)、Visual Studio、Intelなど、さまざまなコンパイラのお気に入りのレベルは何ですか?

編集:

Gcc/g ++で「-Werror」を使用しないことを指摘したかっただけです(ただし、そのユーティリティは理解しています)。

#warning "これは私へのメモです" 

私のコードのいくつかの場所に。すべてのコンパイラは#warningマクロを理解していますか?

45
Juan

これは、私がC++コードに使用している追加のパラノイドフラグのセットです。

    -g -O -Wall -Weffc++ -pedantic  \
    -pedantic-errors -Wextra -Waggregate-return -Wcast-align \
    -Wcast-qual  -Wchar-subscripts  -Wcomment -Wconversion \
    -Wdisabled-optimization \
    -Werror -Wfloat-equal  -Wformat  -Wformat=2 \
    -Wformat-nonliteral -Wformat-security  \
    -Wformat-y2k \
    -Wimplicit  -Wimport  -Winit-self  -Winline \
    -Winvalid-pch   \
    -Wunsafe-loop-optimizations  -Wlong-long -Wmissing-braces \
    -Wmissing-field-initializers -Wmissing-format-attribute   \
    -Wmissing-include-dirs -Wmissing-noreturn \
    -Wpacked  -Wpadded -Wparentheses  -Wpointer-arith \
    -Wredundant-decls -Wreturn-type \
    -Wsequence-point  -Wshadow -Wsign-compare  -Wstack-protector \
    -Wstrict-aliasing -Wstrict-aliasing=2 -Wswitch  -Wswitch-default \
    -Wswitch-enum -Wtrigraphs  -Wuninitialized \
    -Wunknown-pragmas  -Wunreachable-code -Wunused \
    -Wunused-function  -Wunused-label  -Wunused-parameter \
    -Wunused-value  -Wunused-variable  -Wvariadic-macros \
    -Wvolatile-register-var  -Wwrite-strings

それはあなたに始めるための何かを与えるはずです。プロジェクトによっては、サードパーティのライブラリからの警告が表示されないようにするために、トーンを下げる必要がある場合があります(通常、警告が出ないことについてはかなり不注意です)。たとえば、Boostベクトル/マトリックスコードは、g ++に大量の出力を行わせます。ノイズの。

このような場合に対処するより良い方法は、最大に調整された警告を引き続き使用しながら、特定のファイル/行番号で警告が表示されないようにするg ++のラッパーを記述することです。私はそのようなツールをずっと前に書いており、片付ける時間があるときにそれをリリースします。

46

Visual C++では、/W4および/WXを使用しています(警告をエラーとして扱います)。

VCにも/Wallがありますが、標準ヘッダーとは互換性がありません。

私は警告をエラーとして扱うことを選択します、それは私がそれらを修正することを強いるためです。警告を無視するために#pragmaを追加することを意味する場合でも、すべての警告を修正します-そのようにして、私は警告を認識していることを明示的に述べています(そのため、他の開発者は私に電子メールで通知しません)。

24
Paulius

VCもサポートしていると思います

_#pragma message ("note to self")
_

しかし、システムがどんどん成長し、夜間ビルドが30の開発者が同時に取り組むようになると、すべてのメモを自分宛てに読むのに数日かかります。追いつくことができずに辞任しなければならないストレスの下で壊れる...

いいえ、実際には、許可すると警告の量が急速に増加し、本当に重要な警告(初期化されていない変数、コンストラクターで使用されるこのポインターなど)を見つけることができなくなります。

それが私が警告をエラーとして処理しようとする理由です:ほとんどの場合、コンパイラーは私に正しい警告を出し、そうでない場合はコードに文書化して先頭に追加します

_#pragma warning ( Push )
#pragma warning ( 4191 : disable )
// violent code, properly documented
#pragma warning ( pop )
_

読むだけ 彼らはwarning ( N : suppress )プラグマも持っています。

13
xtofl

私は-Wallを使用する傾向があります(誰もがバグを犯すため、誰も完璧ではないため)-Werror(警告をエラーとして扱う)は使用しません。 (偽陽性)。

Litbが常に-Wallを使用することに同意します。さらに、コードが準拠していることを確認したい場合は、-pedanticを使用することもできます。ユニオンと構造体をバイトレベルで処理している場合に役立つ別の警告は-Wpaddedです。

8
codelogic

エラーがオンになっているので、すべての開発を警告で行います。

私はまだVC6で開発しているので、コードには多くの#pragmaがあります(主に4786)。

4
graham.reeds

GCCでは、優先的に-Wall -Wextra -Wwrite-strings -Werrorを使用し、std=で標準を指定します。どの標準がプロジェクトに依存するか:主にそれがどれほど移植可能である必要があるかに依存します。

私が-Werrorを使用する理由は、実際のバグを表していない場合でも、警告は(私には)受け入れられないためです。残りの人生でコンパイルするたびに警告を無視しなければならないのではなく、警告の原因を回避します。コンパイルで警告を許可すると、前回存在しなかった警告を見逃しがちです。

もちろん、サードパーティのコードを扱う場合、警告を取り除くことができない場合があります。次に、-Wオプションを緩和し、-Werrorを削除して、警告のみが発生することを確認するか、サードパーティのコードを変更するかを確認するスクリプトを作成するかどうかを、ケースバイケースで決定します(警告を「修正」するため、または可能であればプラグマで警告を無効にするため)。

3
Steve Jessop

intelコンパイラについてはまだ誰も触れていません。

https://software.intel.com/sites/products/documentation/doclib/iss/2013/compiler/cpp-lin/GUID-D060680A-1A18-4574-8291-5C74E6E31335.htm

-w3はかなりおしゃべりなので、-w2をお勧めします

3
Rob Latham

私は-Wallとstrictのプロトタイプ、および暗黙の関数定義が好きです。それらのエラーは非常に役立ちます。 -Wextraもあり、条件付きであることを意図したものの、誤ってステートメントとして記述したようなものkindsをすべて取得します。

if (something);
   classic_way_to_leak_memory();

Unixライクなシステムでは、ユーザーのENV設定に従う必要があります。そのため、ユーザーが表示および報告する内容は、必要なものとはまったく異なる場合があります。

私はまた、タイプpunning fiendなので、ユーザーが望んでいない限り、-Fno-strict-aliasingも設定する傾向があります。それ以外の場合、クラシックCでの安全なメモリ管理は困難です。

3
Tim Post

ここにGCCのオプションのニースリストがあります: http://mces.blogspot.com/2008/12/year-end-cleaning-ie-on-warning-options.htm 。 -Wallはすべての可能な警告を有効にするわけではなく、一部は明示的に有効にする必要があります。

3
Marco

Visual Cでは/ w3を使用します。すべてのビルドでw4が大量のノイズ(MSライブラリからの大量のノイズ)をスローすることがわかります。追加の警告はごくわずかで、これまでのところバグの原因ではありません。

1
Patrick

また、プロジェクトでコンパイラーに与える可能性のあるすべての警告を確認することも好きです。残念ながら、インテルC++コンパイラーについての回答は、私にとってあまり有益ではありませんでした(リンクは無効です)。自分で調べました。

Qt 5およびqmakeを使用しているため、事前定義された警告レベル-w1。これでは何もできませんが、これだけではなく、ICCにはさらに多くのキーがあります。

-Wcomment 
-Weffc++ 
-Wextra-tokens 
-Wformat 
-Winline // don't use, show only for example
-Wmain 
-Wmissing-declarations 
-Wmissing-prototypes 
-Wnon-virtual-dtor 
-Wp64 
-Wpointer-arith 
-Wremarks 
-Wreturn-type 
-Wsign-compare 
-Wstrict-aliasing 
-Wstrict-prototypes 
-Wtrigraphs 
-Wuninitialized 
-Wunknown-pragmas 
-Wunused-variable

すべての詳細 keys

また、GCCとは異なり、ICCは1つのキー(たとえば、キー-Weffc ++)に対していくつかの警告を生成することを追加します。すべてのリストからいくつかの警告のみを表示したい場合は、キー-wdを使用してください。

私は無効にします:-wd1418,2012,2015,2017,2022,2013。また、警告-wd1572,873,2259,2261はデフォルトでqmakeで無効にされていました。

私はPCHを使用していて、Qt CreatorのメッセージでエラーのようなPCHファイルの使用に関するメッセージを見るのは非常に不愉快です。無効にするには、-Wno-pch-messagesを使用します。

コードで警告を無効にするには、次を使用します:

#if defined(Q_CC_INTEL)
    #pragma warning( Push )
    #pragma warning( disable: 2021 )
#endif

// some code

#if defined(Q_CC_INTEL)
    #pragma warning( pop )
#endif
1
dismine

回答ありがとうございます。私がgcc/g ++以外のものを使用してから久しぶりです。私がずっと前に使用しなければならなかったものは

-fmessage-length = 0(g ++はメッセージを改行する醜い癖があったため)名前空間)

(少なくとも5年前に)Sun Workshop CCコンパイラのデフォルトの警告レベルを超えるものは多すぎることを覚えています。また、これはIntelコンパイラにも当てはまると思います。私はしばらくの間、非gnuコンパイラーの最新情報を知りませんでした。

0
Juan

GCCコンパイラは、新しいバージョンごとに厳しくなります。フラグ-ansi ANSI言語標準の最も厳密な解釈の違反に対する警告を生成します。これは通常、現在のコンパイラでたまたま機能するだけですが、次のバージョンや他のコンパイラでエラーが発生する可能性があります。このフラグは、コンパイラ/バージョンを切り替えるたびにコードを移植する必要をなくすのに役立ちます。

0
palm3D