7

g++ (4.7) の最も極端なエラー チェック フラグの組み合わせを調べたいと思います。古いコンパイラでコードをクロスコンパイルする必要があるため、新しい C++11 仕様は使用していません。これらの古いコンパイラ (ほとんどは g++ 4.0) は、g++4.7 では単に無視される問題を引き起こすことがよくあります。

現在、次の一連のフラグを使用しています。

-Wall -Wcomment -Wformat -Winit-self -ansi -pedantic-errors \
-Wno-long-long -Wmissing-include-dirs -Werror -Wextra

ただし、この組み合わせでは、int を予期する関数に double が渡される、または符号付きと符号なしの int の比較などの問題が特定されず、これにより古いコンパイラがチョークします。

私はドキュメントを読み、-Wsign-compare有効にする必要があります-Wextraが、実際にはそうではないようですので、何かを見落としている可能性があります...

4

2 に答える 2

3

-ansiは、GNU 拡張なしのデフォルト標準のエイリアスです。代わりに を明示的に使用することをお勧めし-std=c++98ますが、それは のデフォルトである必要があるためg++ -ansi、実際には違いはありません。

しかし一般的に、無効であるという理由で新しい gcc によって受け入れられ、古い gcc によって拒否されるようなものは見たことがありません。このような問題は、古いコンパイラのバグか、標準ライブラリのバグであると思われます。Gcc には、正しいものに対する警告はありませんが、古いバージョンでは動作しなかったため、古いバージョンでテストする以外に選択肢はありません。

あなたが言及した特定の問題については:

  • int を期待する関数に double を渡すことはエラーではありません。ただし、未定義の動作である可能性があります。-Wconversion助けるべきです。
  • 符号付きと符号なしの比較も明確に定義されており、常に定義どおりに機能し、等値比較の場合、実際にはプログラマーはより悪いコードを記述します (int より大きい符号なし変数を -1 と比較することは、-1u と比較することとは別のものです)。だから私は実際には常にコンパイルし-Wno-sign-compareます。

コンパイラは、-isystem代わりに で指定されたディレクトリにあるヘッダーの警告を出力しない-Iようにする必要があります。これにより、Qt ヘッダーの警告を黙らせ、独自のコードで有効に保つことができます。だから、使えるはずです-Wconversion

于 2013-01-29T09:20:47.080 に答える
1

コンパイラに加えて、lintまたはその他の静的解析ツールを使用してコードをチェックします。私のLinuxディストリビューションでは、 splintapt-get install splint取得します。簡単にインストールできるように、OS用にパッケージ化されているかどうかを確認してください。

于 2013-01-29T12:16:27.433 に答える