SI_TKILL si_code на ARM для деления с нуля - PullRequest
0 голосов
/ 05 февраля 2019

В настоящее время я пишу обработчик сигналов для ARM, чтобы предоставить как можно больше отладочной информации.В целях тестирования я вызываю разные бедствия.Получаемый мной сигнал SIGFPE, как и ожидалось, но si_code отличается от того, что я ожидал.Мне интересно, почему si_code для целочисленного деления с нулем установлено на SI_TKILL вместо FPE_INTDIV или любого другого SIGFPE si_code на ARM.

Следующая функция используется для вызова ошибки:

int divide_by_zero()
{
   int c = 1;
   int b = 0;
   return c / b;
}

Это поведение по умолчанию?Сокращены ли si_codes на ARM?

Я использую компилятор arm-linux-gcc для цели, предоставляемой Buildroot.

1 Ответ

0 голосов
/ 05 февраля 2019

Согласно POSIX , деление на ноль дает неопределенный результат, а на некоторых архитектурах он генерирует сигнал SIGFPE.


С другой стороны, ABI времени выполнения для архитектуры ARM , 4.3.2 Деление на ноль:

Если вызывается целочисленная или длинная длинная вспомогательная функция деления для деления на0, он должен возвращать как частное значение, возвращаемое вызовом __aeabi_idiv0 или __aeabi_ldiv0, соответственно.Помощник * divmod должен возвращать в качестве остатка либо 0, либо исходный числитель.

(в сторону: в идеале, функция * divmod должна возвращать {бесконечность, 0} или {0, числитель}, где бесконечность - это приближение. Конец в стороне).Функции * div0:

 Возвращает значение, переданное им в качестве параметра.

 Или возвращает фиксированное значение, определенное средой выполнения (например, 0).

Или поднять сигнал (часто SIGFPE) или выдать исключение и не возвращать.

Таким образом, оба безразличия указывают на то, что сигнал или исключение вместоFPE_INTDIV при выполнении целочисленного деления на ноль возможно и допустимо.

...