在ARM SI_TKILL si_code与零除

问题描述 投票:1回答:1

目前,我正在写一个信号处理器为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里面提供的目标。

linux arm signals buildroot
1个回答
1
投票

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当执行一个整数除零是可能的和有效的。

© www.soinside.com 2019 - 2024. All rights reserved.