目前,我正在写一个信号处理器为ARM提供尽可能多的调试信息,我可以。出于测试目的,我会不同的灾难。信号我收到isSIGFPE
,符合市场预期,但si_code跟我想象的不同。我很纳闷,为什么零整数除法的si_code设置为SI_TKILL
而不是FPE_INTDIV
或ARM任何其他SIGFPE
si_code。
下面的函数用来导致错误:
int divide_by_zero()
{
int c = 1;
int b = 0;
return c / b;
}
这是默认的行为吗?上ARM的si_codes减少?
我用臂的linux-gcc编译器用于由Buildroot里面提供的目标。
据POSIX,被零除产生一个未定义的结果,并且在一些结构中,它会产生一个SIGFPE信号。
在另一方面,Run-time ABI for the ARM Architecture,4.3.2被零除:
如果一个整数或长的长除法辅助函数呼吁除以0,它应该返回作为商通过调用返回的分别__aeabi_idiv0的调用或__aeabi_ldiv0,值。 A * divmod助手应该返回余数为0或原来的分子。
(除了:理想地,* divmod函数应返回{无穷大,0}或{0,分子},其中无穷大是一个近似值结束一边。)。在* DIV0功能:
返回传递给它们的参数值。
或者,返回由所述执行环境(如0)中所定义的固定值。
或者,提出一个信号(通常SIGFPE)或抛出一个异常,不返回。
所以含蓄,两者都指示信号或异常而不FPE_INTDIV
当执行一个整数除零是可能的和有效的。