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
...
这个信息是一致的。每次此函数崩溃时,num
和 denom
的值都是相同的。
我试图将 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 小一。
通常,当我收到 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
...
这个信息是一致的。每次此函数崩溃时,num
和 denom
的值都是相同的。
我试图将 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 小一。