9

を使用していくつかの配列インデックスが計算される大規模な C ライブラリを使用してintいます。問題のあるコード行に絞り込むような方法で、実行時に整数オーバーフローをトラップする方法を見つける必要があります。libc マニュアルには次のように記載されています。

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

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

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

その間、llvm 用に設計されたツールを見つけました: http://embed.cs.utah.edu/ioc/ しかし、gcc/icc に相当するものはないようです。

4

4 に答える 4

3

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

gcc には-ftrapvオプションがあることがわかりました。簡単なテストで、少なくとも私のシステムではオーバーフローがトラップされていることが確認されました。非常に便利なツールと思われるため、詳細がわかり次第、より詳細な情報を投稿します。

于 2012-04-17T23:59:04.837 に答える
2

オーバーフローが発生している行を正確に知っていますか?その場合、問題の操作によってオーバーフローが発生した場合は、アセンブラのキャリーフラグを確認できる可能性があります。これは、CPUが多数の計算を行うために使用するフラグであり、経営幹部レベルでは使用できませんが、問題のデバッグに役立つ可能性があります。または、少なくとも何かを行う機会を与える可能性があります。

ところで、整数トラップについて話しているgcc(-ftrapv)のこのリンクを見つけました。あなたが探しているものかもしれません。

于 2012-04-17T23:26:40.453 に答える
2

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

符号付き整数演算では、オーバーフローは未定義の動作につながります。なんでも起こる可能性がある。そして、オプティマイザーは、あふれるものを最適化することに積極的になっています。したがって、最善の策は、オーバーフローが発生したときにそれをトラップするのではなく、オーバーフローを回避することです。CERTの「SecureIntegerLibrary 」(そこで参照されているURLはAWOL / 404になっているようです。まだ何が起こっているのかわかりません)、またはGoogleの「SafeIntegerOperation」ライブラリの使用を検討してください。

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

于 2012-04-17T23:16:23.920 に答える
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;
}

この場合、aandを追加しようとし、追加さbれた場合はoverflowラベルに移動します。オーバーフローがない場合は、引き続き追加を行い、それを返します。

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

于 2012-04-17T23:47:59.967 に答える