如何在函数的完整性检查中处理添加的整数溢出?

时间:2012-10-20 05:35:46

标签: c++ c

  

可能重复:
  Best way to detect integer overflow in C/C++

我在C中编写一个函数,但问题是通用的。该函数采用三个整数并返回有关这三个整数的一些信息。

问题我怀疑这里的整数可能达到最大值,这可能导致溢出。

例如:如果我传递尽可能的最大值且b可以是1 - max,那么在这种情况下,如果条件导致溢出,表达式(a + b)> c?如果是这样,我该如何处理?

我的解决方案是将一个长整数作为临时变量来保持a + b的值并在表达式中使用它,但它听起来很脏。

请参阅此片段:

int
triangle_type(int a, int b, int c) {
    if (!((a+b)>c)&&((b+c) > a)&&((a+c>b))) {
        return -1;
    }
}

2 个答案:

答案 0 :(得分:3)

在当前处理器上,整数上没有真正的信令溢出。因此,在32位处理器上,整数运算在位级进行模数2 ^ 32。当你加上两个int - s并且发生一些“溢出”时,在某个状态寄存器中设置溢出(或进位)位(并且算术运算完成模数2 ^ 32)。如果(通常是这种情况)没有机器指令测试溢出状态位,则没有任何反应。

因此,控制流不会因溢出而改变(它通常会在除以零时改变,例如使用SIGEMT信号)。

如果你想在C中移植溢出的情况,你可以测试例如两个正int - s的总和保持正数。 (如果是负数,确实会发生溢出)。

你也可能对bignums感兴趣,例如使用gmp库。您也可以使用<stdint.h>并谨慎使用int32_tint64_t进行显式转换。最后,你可以(正如大多数程序员所做的那样)选择忽略这个问题。

注意:正如Jonathan注意到的那样,你可能属于undefined behaviorunspecified behavior案件。如果你真的在乎,请使用bignums。但是,您可以选择不关心。

答案 1 :(得分:0)

你可以做这样的事情

// returns true if a+b > c
inline int safe_sum_greater (int a, int b, int c) {
   int a1 = a / 4; int a2 = a % 4;
   int b1 = b / 4; int b2 = b % 4;
   int c1 = c / 4; int c2 = c % 4;
   int s2 = a2 + b2;

   int s1 = a1 + b1 + s2 / 4;
   s2 = s2 % 4;
   return (s1 > c1) || ( (s1 == c1) && (s2 > c2) );
}

性能不会差,因为只会使用逐位操作。 我没有充分考虑这个负面数字,所以要小心使用。