10

多くの場合、コーディングしている特定のプラットフォームについて仮定を立てます。たとえば、符号付き整数は 2 の補数ストレージを使用する、または(0xFFFFFFFF == -1)その性質のものを使用します。

これらの種類の最も一般的な違反についてコードベースをチェックできるツールは存在しますか?

(上記の例は符号付き整数に固有のものですが、他のエラー(アライメントやバイトオーダーなど)にも興味があります)

4

4 に答える 4

4

オンにしたいコンパイラ警告にはさまざまなレベルがあり、警告をエラーとして扱うことができます。

コードのさまざまなポイントで行うことがわかっている他の仮定がある場合は、それらをアサートできます。静的アサートでそれを行うことができる場合、コンパイル時に失敗します。

于 2010-11-29T16:25:53.027 に答える
4

私は、CLang が (ライブラリとして) 静的アナライザーを非常に積極的に開発していることを知っています。

目標は、分析時にエラーを検出することですが、検出されたエラーの正確な範囲はまだ明確ではありません。このライブラリは "Checker" と呼ばれ、T. Kremenek が担当しています。clang-dev メーリング リストで質問できます。

実行されているチェックについて何らかの参考文献があるという印象はありません。また、実稼働ツールとしてはまだ十分に成熟していないと思います (変化の速度を考えると) が、一見の価値があるかもしれません。

于 2010-11-29T17:55:46.260 に答える
3

たぶん静的コード分析ツール?数年前に使用しましたが、このようなエラーが報告されました。それは完璧ではなく、まだ制限されていましたが、おそらくツールは今より優れていますか?

更新:たぶんこれらの1つ: どのオープンソースC ++静的分析ツールが利用可能ですか?

update2:私はあなたの例でFlexeLintを試しました(http://www.gimpel-online.com/OnlineTesting.htmlの日曜大工の例を使用してオンラインで試すことができます)そしてそれについて不平を言いますが、おそらくある意味ではありませんあなたは探している:

5    int i = -1;
6    if (i == 0xffffffff)
diy64.cpp  6  Warning 650:  Constant '4294967295' out of range for operator '=='
diy64.cpp  6  Info 737:  Loss of sign in promotion from int to unsigned int
diy64.cpp  6  Info 774:  Boolean within 'if' always evaluates to False [Reference: file diy64.cpp: lines 5, 6]
于 2010-11-29T17:23:59.727 に答える
2

非常に興味深い質問です。プログラマーの意図/仮定に大きく依存するため、これらに役立つフラグを立てるツールを作成するのは非常に難しいと思います。

たとえば、次のような構造は簡単に認識できます。

x &= -2; // round down to an even number

2 の補数表現に依存しているように見えますが、マスクが定数 "-2" ではなく変数の場合はどうなるでしょうか?

はい、さらに一歩進んで、 bitwise での signed int の使用&、unsigned int への負の定数の割り当て、および unsigned int への signed int の割り当てなどについて警告することができますが、私は思うそれは非常に多くの誤検知につながります。

[申し訳ありませんが、実際には答えではありませんが、コメントするには長すぎます]

于 2010-11-29T17:21:37.090 に答える