[英]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
,這怎么不溢出? 如果假設a
和b
都是正數,那么為什么首先將它們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.