非零分母的EXC_ARITHMETIC错误 - XCode

时间:2015-05-20 17:48:18

标签: c xcode division

通常,当我收到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的调试窗口会在崩溃网站上保存此信息:

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

此信息是一致的。每次此功能崩溃时,numdenom的值都相同。

我试图在调试窗口中专门输入num / denom作为表达式,XCode立即崩溃(我想,这不是关于这个bug的最奇怪的事情)。

我也可以浏览调试窗口以观察GP_Node* node,并且每次崩溃时它都是一个有效的指针,带有有效的元素。

XCode的调试窗口是否有问题? (我刚刚更新到XCode 6.3.2)

denom秘密0?这甚至可能吗?

是否有另一种方法可以从EXC_ARITHMETIC的分区获得int

发生了什么事?

1 个答案:

答案 0 :(得分:2)

你的num恰好是一个可以用有符号的32位变量表示的最负数(假设是2的补码);不幸的是,可以如此表示的最正数是2147483647 - 一个小于-2147483648 / -1。