簡體   English   中英

如何檢測C ++中的溢出?

[英]How to detect an overflow in C++?

我只是想知道是否有一些方便的方法來檢測在運行時期間C ++程序中使用的任何默認數據類型的任何變量是否發生溢出? 方便的是,我的意思是,如果每個變量的值都在其數據類型的范圍內,則無需編寫代碼來跟蹤每個變量。 或者如果不可能實現這一點,你會怎么做?

例如,

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

在使用“gcc -W -Wall”編譯或運行時,不會給出任何錯誤或警告。

謝謝並恭祝安康!

考慮使用boosts數字轉換 ,它為您提供negative_overflowpositive_overflow異常( 示例 )。

您的示例實際上並未在IEEE-754兼容系統的默認浮點環境中溢出。

在這樣的系統中,float是32位二進制浮點,FLT_MAX是C99十六進制浮點表示法中的0x1.fffffep127。 將其寫成十六進制的整數,它看起來像這樣:

0xffffff00000000000000000000000000

添加一個(沒有舍入,就好像值是任意精度整數),給出:

0xffffff00000000000000000000000001

但是在IEEE-754兼容系統的默認浮點環境中,任何值之間

0xfffffe80000000000000000000000000

0xffffff80000000000000000000000000

(包括您指定的值)舍入為FLT_MAX。 沒有溢出發生。

使問題復雜化,您的表達式(FLT_MAX + 1)很可能在編譯時評估,而不是運行時,因為它沒有對您的程序可見的副作用。

在我需要檢測溢出的情況下,我使用SafeInt<T> 這是一個跨平台的解決方案,可以在溢出情況下拋出異常。

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

它可以在codeplex上使用

回到過去我開發C ++(199x)時,我們使用了一個名為Purify的工具。 那時它是一個工具,用於檢測目標代碼並在測試運行期間記錄所有“壞”。 我做了一個快速的谷歌,我不太確定它是否仍然存在。

據我所知,現在有幾種開源工具或多或少都相同。 結帳電子設備和valgrind。

Clang提供-fsanitize=signed-integer-overflow-fsanitize=unsigned-integer-overflow

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM