这个检测整数加法溢出的函数实际上有用吗?

时间:2016-04-28 15:29:10

标签: c++ c integer-overflow

在阅读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如何不溢出?如果假设ab都是正数,那么为什么首先要使它们int而不是unsigned int

2 个答案:

答案 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似乎提供了更正确的代码。