运行时错误除以-1

时间:2014-11-02 22:30:56

标签: c++ xcode integer-division secure-coding

我不怀疑是否需要检查除零。我从来没有听说过以负面的方式检查分裂!

if( *y == 0 )
    return 0; //undefined
else
    return *x / *y;

x, yint32_t的指针,我会在相关的情况下包含此详细信息。

在运行时,如果*x==0x80000000, *y==0xffffffff,我收到错误(在Xcode中):

  

EXC_ARITHMETIC(代码= EXC_I386_DIV,子代码= 0x0)

我在网上找到的所有建议都是除零,但正如你从上面的检查中看到的那样,我可以从调试窗口看到,这不是这里的情况。

错误意味着什么,我该如何解决?

1 个答案:

答案 0 :(得分:12)

2的补码表示是不对称的:有一个负数而不是正数,而负数没有正对应。因此,否定MIN_INT是整数溢出(其中MIN_INT是唯一的1位是符号位的值,对于32位整数是0x80000000)。

因此,

MIN_INT / -1也是算术溢出。与减法溢出(很少检查)不同,分割时溢出会导致陷阱,显然是你的情况发生了什么。

而且,是的,从技术上讲,你应该在分割之前检查MIN_INT / -1溢出情况,因为结果是未定义的。

注意:在Intel x64架构的常见情况下,除法溢出确实陷阱,与除以0完全相同。令人困惑的是,相应的Posix信号为SIGFPE,通常被认为是as"浮点异常#34;虽然看不到浮点。当前的Posix标准实际上将SIGFPE视为意义"错误的算术运算"。