我正在调试用C编写的生产代码,其最简单的形式可以显示为 -
void
test_fun(int sr)
{
int hr = 0;
#define ME 65535
#define SE 256
sr = sr/SE; <-- This should yield 0
if(sr == 1)
hr = ME;
else
hr = (ME+1)/sr; <-- We should crash here.
}
我们将sr
传递为128,理想情况下应该在处理器中除以零错误。我看到这个除法成功地发生了商,因为0x7ffffffff(hr
是这个值)。
当我在使用gcc的英特尔平台上编译和运行相同时,这不会发生(当尝试除零时崩溃)。
想知道这个大商背后的原理。不确定是否只是其他一些我还需要揭开的错误。 有人可以帮助我使用另一个同样的程序吗?
答案 0 :(得分:3)
除以零为undefined behaviour,请参阅C11 standard 6.5.5#5(最终草稿)。
获取陷阱或SIGFPE只是对CPU / OS的礼貌。 PowerPC作为典型的RISC CPU无法捕获它,因为在进行实际划分之前,可以通过简单地检查除数来安全地检测它。 x86 OTOH 确实抓住这个 - 典型的CISC行为。
如果更高层标准需要,您可能错过了自动发出此检查的编译器选项。例如,POSIX不强制执行SIGFPE,这是可选的。
答案 1 :(得分:3)
根据PPC架构手册(您可以从IBM获得),在PPC上除以0不会产生任何类型的信号或陷阱;相反,您只需获得一些因处理器而异的不确定值。在您的情况下,它看起来在将正数除以0时生成MAXINT(最大正整数)的特定PPC变体。