2012-04-17 2 views
7

私は、大きな配列のインデックスがintを使って計算されるCライブラリを使っています。 問題のあるコード行に絞り込むために、実行時に整数オーバーフローをトラップする方法を見つける必要があります。 libcの手動状態:整数のオーバーフローを検出する

FPE_INTOVF_TRAP 整数オーバーフロー(Cプログラムでは不可能あなたは、ハードウェア固有の方法でトラップオーバーフローを有効にしない限り)。

ただし、gccオプション-ffpe-trapでは、FP番号のみが適用されることが示唆されていますか?
整数オーバーフロートラップを有効にする方法はありますか?私のシステムはXeon/Core2、gcc-4.x、Linux 2.6です。

私は同様の質問を見てきましたが、それらはすべてコード修正に沸きます。私はどのコードが最初に問題があるかを知る必要があります。
Xeonsがオーバーフローをトラップできない場合、どのプロセッサが可能ですか?私はemt64以外のマシンにもアクセスできます。

私はllvm用に設計されたツールを見つけました:http://embed.cs.utah.edu/ioc/ gcc/iccでは同等の機能はないようですか?

+0

私が知る限り、x86プロセッサは整数オーバーフローのトラッピングをサポートしていません。多くのRISC cpus do(powerとsparcはどちらも最低)、古いミニ/メインフレームCPU(VAXなど) –

+0

Powerを試すことができ、VAXは存在しません。 – Anycorn

答えて

3

私は自分の質問に答える必要があるかもしれません。

gccに-ftrapvオプションがあることがわかりました。私のシステムオーバーフローが少なくともトラップされていることをクイックテストで確認しています。私はそれが非常に有用なツールのように見えるので、私はより多くの詳細情報を投稿します。

+0

参照:http://stackoverflow.com/a/5005792/462335 – nibot

2

もちろん、符号なし整数演算はオーバーフローしません。

符号付き整数演算では、オーバーフローは未定義の動作につながります。なんでも起こる可能性がある。オプティマイザは、オーバーフローするものを最適化することに関して積極的になっています。したがって、オーバーフローが発生したときにトラップするのではなく、オーバーフローを避けることをお勧めします。 CERT 'Secure Integer Library'(AWOL/404が参照されていると思われるURL、何が起こっているかわからない)またはGoogleの'Safe Integer Operation'ライブラリを使用することを検討してください。

オーバーフローをトラップする必要がある場合は、回答が非常にプラットフォーム固有であるため、関心のあるプラットフォーム(バージョンを含むO/S、バージョンを含むコンパイラ)を指定する必要があります。

+1

置き換える操作(size_t)を知る必要があります。私はシステム/コンパイラを質問に指定しました。 – Anycorn

2

オーバーフローが発生している行を正確に知っていますか?そのような場合は、問題の操作がオーバーフローを引き起こした場合に、アセンブラのキャリーフラグを見ることができます。これは、CPUが多数の計算を行うために使用するフラグであり、Cレベルでは利用できませんが、問題をデバッグするのに役立ちます。

BTW、found this整数トラップについてのgcc(-ftrapv)用のリンク。あなたが探しているものかもしれません。

+0

いいえ、問題はオーバーフローが発生する場所を見つけることです – Anycorn

+2

カウンタのメモリブレークポイントへの書き込みを中止してお手伝いしますか? –

+0

私はそうは思わない。 'int 'が' size_t'の代わりに使われる場所は複数あり、手動デバッグは非常に難しいです。私は解決策を見つけたかもしれない。 – Anycorn

0

あなたはそれが実際にどうかを確認するために、オーバーフローを発生させる可能性がある命令を使用して、オーバーフローフラグをテストするためにgccのインラインアセンブラを使用することができます。

int addo(int a, int b) 
{ 
    asm goto("add %0,%1; jo %l[overflow]" : : "r"(a), "r"(b) : "cc" : overflow); 
    return a+b; 
overflow: 
    return 0; 
} 

をこの場合には、aを追加しようとb、そうであればoverflowラベルに移動します。オーバーフローがなければ、アドインをやり直して返します。

これは、インラインasmブロックが値を出力することも分岐することもできないというGCCの制限に繋がります。実際の結果を得るためには、2回目の追加は必要ありません。

関連する問題