簡體   English   中英

如何在C程序中找到(全部)整數溢出?

[英]How to find (all) integer overflows in a C program?

我正在開發一個通常工作得很好的大型項目,但是一旦輸入數據大小超出某些限制就會出現嚴重問題。

這些問題(懷疑)只是由於有符號的整數溢出,如下所示:

int a, o;
// Initialize a and o
int x = (a+o) >> 1);

顯然,一旦a和o的總和溢出(大於2 ^ 31-1),x就不再是a和o的平均值。

是否有一種通用的方法來查找正在運行的程序中的所有這些整數溢出?

我正在考慮像Valgrind或GDB擴展的工具,它在每個整數算術指令處中斷,獲取參數並將正確的結果(使用較大的數據類型或任意精度算術計算)與實際結果進行比較。 如果結果不同,它應該輸出警告,觸發調試中斷或類似的事情。

我知道,如何檢查單個算術指令是否有溢出(例如檢查添加的符號),但是由於代碼量很大,對於我來說,通過整個項目並手動插入檢查代碼並不是一個可行的解決方案。 。

您必須完成所有代碼並計算出用戶輸入的限制並驗證輸入。 您可能還需要重寫一些算法以減少溢出問題。

由於您提供的示例不適用於負值,因此您應該使用unsigned int ,這樣您就可以獲得額外的數量級。

編輯: gcc有-ftrapv選項,但這通常不會做任何事只適用於-O0 如果你正在采取捕獲溢出的方法,你仍然需要很好的代碼知識才能完全測試它。

對於大型代碼庫, Coverity是一個很好的工具。 我不確定它是否會檢測到all整數溢出,但值得一試。

如何通過代碼並用DEBUGADD(a,b)替換所有“a + b”的腳本 - 你可以做的事情:

#ifdef DEBUG
int addFn(int a, int b) {
  long long m;
  int n;
  m = (long long)a + (long long)b;
  n = a + b;
  if (m != (long long)n)
    printf("PANIC!\n");
  return n;
}
#define DEBUGADD(a,b) addFn(a,b)
#else
#define DEBUGADD(a,b) ((a)+(b))
#endif

暫無
暫無

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

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