通常,当我收到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
...
此信息是一致的。每次此功能崩溃时,num
和denom
的值都相同。
我试图在调试窗口中专门输入num / denom
作为表达式,XCode立即崩溃(我想,这不是关于这个bug的最奇怪的事情)。
我也可以浏览调试窗口以观察GP_Node* node
,并且每次崩溃时它都是一个有效的指针,带有有效的元素。
XCode的调试窗口是否有问题? (我刚刚更新到XCode 6.3.2)
denom
秘密0
?这甚至可能吗?
是否有另一种方法可以从EXC_ARITHMETIC
的分区获得int
?
发生了什么事?
答案 0 :(得分:2)
你的num
恰好是一个可以用有符号的32位变量表示的最负数(假设是2的补码);不幸的是,可以如此表示的最正数是2147483647 - 一个小于-2147483648 / -1。