在阅读this question的评论时,我发现了comp.lang.c FAQ的链接,其中显示了一个"谨慎添加功能"据称可以检测到整数溢出:
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
?
答案 0 :(得分:4)
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]
的范围可能是int: [INT_MIN...INT_MAX]
的一半。 IOWs:INT_MAX == UINT_MAX
。这些系统现在很少见。 IAC,不需要使用is_undefined_add1()
编码来更改类型。
答案 1 :(得分:1)
可能他们只是忽略了它。 FAQ页面上的Additional links似乎提供了更正确的代码。