簡體   English   中英

這個檢測整數加法溢出的函數實際上有用嗎?

[英]Does this function for detecting integer addition overflow actually work?

在閱讀這個問題的評論時,我遇到了一個指向comp.lang.c常見問題的鏈接,該鏈接顯示了一個“小心添加功能”,據稱可以檢測到整數溢出:

int
chkadd(int a, int b)
{
    if (INT_MAX - b < a) {
        fputs("int overflow\n", stderr);
        return INT_MAX;
    }
    return a + b;
}

如果b == -1 ,這怎么不溢出? 如果假設ab都是正數,那么為什么首先將它們int而不是unsigned int

OP已經確定INT_MAX - b可能溢出,導致剩余代碼無效以進行正確的溢出檢測。 這是行不通的。

if (INT_MAX - b < a) {  // Invalid overflow detection

在沒有UB的情況下檢測溢出的方法如下:

int is_undefined_add1(int a, int b) {
  return (a < 0) ? (b < INT_MIN - a) : (b > INT_MAX - a);
}

為什么首先讓它們成為int而不是unsigned int

改為unsigned並不能解決一般問題。 unsigned: [0...UINT_MAX]范圍unsigned: [0...UINT_MAX]可以是int: [INT_MIN...INT_MAX]一半int: [INT_MIN...INT_MAX] IOWs: INT_MAX == UINT_MAX 這些系統現在很少見。 IAC,不需要使用is_undefined_add1()編碼來更改類型。

可能他們只是忽略了它。 FAQ頁面上的其他鏈接似乎提供了更正確的代碼。

暫無
暫無

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

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