4

実行時に C++ プログラムで使用されるデフォルトのデータ型の変数にオーバーフローが発生したかどうかを検出する便利な方法があるのだろうか? 便利とは、値が変化するたびにデータ型の範囲内にある場合、各変数を追跡するコードを記述する必要がないことを意味します。または、これを達成することが不可能である場合、どのようにしますか?

例えば、

float f1=FLT_MAX+1;
cout << f1 << endl;

「gcc -W -Wall」を使用したコンパイルでも実行でも、エラーや警告は発生しません。

よろしくお願いします!

4

5 に答える 5

6

あなたと例外を与えるブースト数値変換の使用を検討してください()。negative_overflowpositive_overflow

于 2009-09-22T14:26:59.467 に答える
4

あなたの例は、IEEE-754準拠のシステムのデフォルトの浮動小数点環境では実際にはオーバーフローしません。

float が 32 ビット 2 進浮動小数点であるようなシステムでは、FLT_MAX は C99 16 進浮動小数点表記で 0x1.fffffep127 です。16 進数の整数として書き出すと、次のようになります。

0xffffff00000000000000000000000000

1 を追加すると (値が任意精度の整数であるかのように丸められずに)、次のようになります。

0xffffff00000000000000000000000001

しかし、IEEE-754 準拠システムのデフォルトの浮動小数点環境では、

0xfffffe80000000000000000000000000

0xffffff80000000000000000000000000

(指定した値を含む) は FLT_MAX に丸められます。オーバーフローは発生しません。

さらに複雑なことに、式 (FLT_MAX + 1) は、プログラムに目に見える副作用がないため、実行時ではなくコンパイル時に評価される可能性があります。

于 2009-09-22T14:29:54.180 に答える
3

オーバーフローを検出する必要がある状況では、 を使用しますSafeInt<T>。これは、オーバーフローの状況で例外をスローするクロス プラットフォーム ソリューションです。

SafeInt<float> f1 = FLT_MAX;
f1 += 1; // throws

コードプレックスで利用可能です

于 2009-09-22T14:25:16.767 に答える
2

私が C++ (199x) を開発していた昔、Purify というツールを使用していました。当時は、オブジェクト コードを計測し、テスト実行中にすべての「問題」をログに記録するツールでした。簡単にグーグルで検索しましたが、まだ存在するかどうかはわかりません。

私の知る限り、今日ではいくつかのオープンソース ツールが存在し、それらは多かれ少なかれ同じことを行います。electricfence と valgrind を確認してください。

于 2009-09-22T15:02:25.917 に答える
0

Clang は と を提供-fsanitize=signed-integer-overflow-fsanitize=unsigned-integer-overflowます。

http://clang.llvm.org/docs/UsersManual.html#controlling-code-generation

于 2014-11-29T15:37:20.447 に答える