2012-06-02 58 views
6

可能重複:
Best way to detect integer overflow in C/C++C++中的自動溢出檢測?

通常情況下,當我用C++編寫使用大量溢出時發生我也說不上來,即使我使用的東西像什麼long long或其他64位數據類型。有沒有一種有效的方法來檢測何時發生溢出,而不是目擊錯誤的值?

+1

而是使用原始的整數值,可以使用對象與當溢出發生時拋出異常重載算術運算符。 – jamesdlin

+2

你對數字進行的操作是什麼? – Baget

+0

@Baget可以是任何東西。加法,減法,乘法,指數等等。取決於程序。 –

回答

2

可能沒有多,你會從標準C++得到:

5表達式

如果表達式的評估過程中,其結果是不 數學定義或不在 其類型的可表示值範圍內,行爲未定義。 [注意:C++的大多數現有的 實現忽略整數溢出。除數 的零點處理,使用零除數形成餘數,並且所有浮點計數的例外情況因機器而異,通常可通過庫函數進行調整。末端音符]

你的最好的辦法是可能使用在<cstdint>uint32_t定義的標準固定寬度的整數類型。

看看<cerrno>標頭也有錯誤代碼,例如EOVERFLOW。然後是<stdexcept>overflow_error/underflow_error類。

+0

EOVERFLOW可以由庫函數設置,但它不是由算術運算設置的。 –

1

事實上,你甚至無法可靠地檢測到溢出事件,因爲有符號整數運算中的溢出會導致未定義的行爲。如果編譯器可以看到代碼路徑只在發生溢出時才能達到,則可以將其完全優化(因爲在未定義的行爲情況下它可以執行任何操作)。無符號類型的不同之處在於它們定義了溢出特性(它們執行模數算術)。

因此,檢測簽名類型溢出的唯一方法是事先進行適當的檢查,這非常昂貴。設計一些東西幾乎總是有效得多,這樣你的算法的一個不變量可以確保不會有溢出。

至於在檢測到可能的溢出發生之前的資源,請參閱https://stackoverflow.com/a/199413/445525