2010-11-29 4 views
10

多くの場合、符号付き整数は2の補数ストレージを使用するか、または(0xFFFFFFFF == -1)などの性質を持つものなど、コーディングしている特定のプラットフォームについての前提があります。共通の不特定の動作をチェックするC++用のツールはありますか?

これらの種類の最も一般的な違反(移植可能なコードを望んでいるが奇妙な非2の補数のマシンを持っていない人のために)のコードベースをチェックできるツールはありますか?

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

+1

用語のポイント:あなたが話していることは、定義された実装であり、未定義ではありません。整列、バイトオーダー、符号付き整数表現...これらのすべては実装によって定義され、標準でそのように指定されます。 –

+0

@up、true。しかし、OPは「未定義」ではなく「未定義」と述べている。ここに該当するものがわからない - http://stackoverflow.com/questions/2397984/undefined-unspecified-and-implementation-defined-behavior – Kos

+0

@ノア・ロバーツ:「1.3.25」参照:**未指定の動作**整形式の場合は の動作(少なくともC++ 0x FCDによる) –

答えて

4

あなたが持っているしたいと思うかもしれコンパイラの警告のさまざまなレベルがあります。警告をエラーとして扱うことができます。

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

+1

これはもちろんです。たぶん私は行方不明のGCCスイッチがありますが、この種のことについては警告しません。 (MSVCはどちらでもありません) –

2

非常に興味深い質問です。私はそんなに例えば、のような構造を認識しやすいだろう

プログラマの意図/仮定に依存しているため、これらの有効フラグにツールを書くことは非常に挑戦することだと思う:

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

は2の補数表現に依存しているが、マスクが定数 "-2"の代わりに変数であればどうなるだろうか?

はい、それ以上のステップを踏んで、符号付きintをビット単位で使用すると、ビットごとに&、負の定数を符号なしintに代入すること、および符号付きintをunsigned intなどに割り当てることができますしかし、それは偽陽性がひどいことにつながると思います。 [コメントのため申し訳ありませんが、そうでもない答えが、あまりにも長い]

たぶん

+0

もちろん、そのようなツールは完璧なものではありませんが、私はそのようなことの大部分がより簡単に認識できると思います。 (サイドノート:偶数番号のアルゴリズムにファイルを切り捨ててしまいました。それは一度も見たことがありません) –

3

静的コード解析ツール?私は数年前にこれを使いました。このようなエラーが報告されました。それは完璧ではなく、依然として限られていましたが、おそらくツールは今より良くなっていますか?

更新: はたぶん、これらの1: What open source C++ static analysis tools are available?

アップデート2: 私はあなたの例で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] 
+0

例? = 1 –

+0

はい...例...実際に私はそれが呼び出された方法を覚えていない、私はそれがCoverityだと思う。私が知っているのは、商用ツールであり、多くの費用がかかります。 – rve

+0

は、次にカバー率になるかもしれません:p実際にFlexeLintからの出力は非常に興味深いです、 'Loss of sign'は赤いニシンです。 –

4

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

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

私は、チェックが実行されていることについて何らかの参考資料があるとは感じていませんが、まだ実働ツールではまだ成熟しているとは思われませんが一見価値がある。

関連する問題