![](/img/trans.png)
[英]How to detect possible / potential stack overflow problems in a c / c++ program?
[英]How to detect an overflow in C++?
我只是想知道是否有一些方便的方法來檢測在運行時期間C ++程序中使用的任何默認數據類型的任何變量是否發生溢出? 方便的是,我的意思是,如果每個變量的值都在其數據類型的范圍內,則無需編寫代碼來跟蹤每個變量。 或者如果不可能實現這一點,你會怎么做?
例如,
float f1=FLT_MAX+1;
cout << f1 << endl;
在使用“gcc -W -Wall”編譯或運行時,不會給出任何錯誤或警告。
謝謝並恭祝安康!
考慮使用boosts數字轉換 ,它為您提供negative_overflow
和positive_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。
可能對此主題有用的信息:
Seacord的“C和C ++中的安全編碼”第5章
http://www.informit.com/content/images/0321335724/samplechapter/seacord_ch05.pdf
適用於C ++的SafeInt類
http://blogs.msdn.com/david_leblanc/archive/2008/09/30/safeint-3-on-codeplex.aspx http://www.codeplex.com/SafeInt
C的IntSafe庫:
http://blogs.msdn.com/michael_howard/archive/2006/02/02/523392.aspx
來源: 如何檢測整數溢出?
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.