EXC_ARITHMETIC 非零分母错误 - XCode

EXC_ARITHMETIC Error With Nonzero Denominator - XCode

通常,当我收到 EXC_ARITHMETIC 错误时,这意味着我除以零,这对我来说很有意义。但是,这次我不知道发生了什么。这是一个被频繁调用的函数:

GP_TYPE GP_NodeFunction_Divide(GP_Node* node, GP_Mem* mem, void* data){

    /* These are just normal function calls.
       I can say with some certainty they are not misbehaving. */
    GP_TYPE denom = GP_Call(node->next[1], mem, data);
    GP_TYPE num = GP_Call(node->next[0], mem, data);

    if (denom) {
        /* denom != 0, right? */
        return num / denom; /* Crash! EXC_ARITHMETIC */
    }

    else return 1e12;
}

我的程序运行了几分钟没有任何问题,估计这个函数被调用了几十万次,但偶尔还是会在这里崩溃。

GP_TYPE定义如下:

#ifdef GP_USE_DOUBLE
#define GP_TYPE double
#else
#define GP_TYPE int
#endif

GP_USE_DOUBLE 未定义。

我一直在使用 -O0 进行编译,并且 XCode 的调试 window 在崩溃站点保存了以下信息:

...
num = (int)-2147483648
denom = (int)-1
...

这个信息是一致的。每次此函数崩溃时,numdenom 的值都是相同的。

我试图将 num / denom 作为表达式专门输入到调试 window 中,然后 XCode 立即崩溃(我想这不是这个错误最奇怪的地方) .

我还可以导航调试 window 来观察 GP_Node* node,它一直是一个有效的指针,具有有效的元素,每次它崩溃。

XCode 的调试 window 有问题吗? (我最近刚更新到 XCode 6.3.2)

denom偷偷0吗?这可能吗?

还有其他方法可以从 int 的除法中得到 EXC_ARITHMETIC 吗?

这是怎么回事?

你的num恰好是一个带符号的32位变量可以表示的最负数(假设为2的补码);对您来说不幸的是,可以表示的最大正数是 2147483647 - 比 -2147483648/-1 小一。