Имеется код вида
int64_t a = b/c
b и c какие-то произвольные числа
требуется записать 0 в переменную a, если произошел SIGFPE.
Проверять значения b и c не вариант, нужно как-то задавать значение для a в обработчике сигнала.
Задача в такой постановке выглядит странной, если это не просто учебная задача на обработку сигналов.
Если это учебная задача -- то конечно, и ассемблерная вставка тут может помочь, но это не вопрос для тостера.
Если это практическая задача, то решить её можно следующими способами:
- наиболее простой и переносимый, но не самый быстрый -- таки проверить значения b и c перед вычислениями.
- следующий по простоте -- использовать setjmp перед началом блока вычислений который может закончиться сигналом, в обработчике сигнала вызвать longjmp, после возврата присвоить результатам нужные значения.
- следующий вариант -- нифига не простой и не переносимый -- устанавливать обработчик сигнала с помощью
sigaction, заказывать доставку SA_SIGINFO и анализировать ucontext (третий аргумент) в обработчике сигнала. Сложность заключается в том, что связь между тем, что будет записано в ucontext и исходным кодом на C ни разу не очевидна. Т.е. можно извлечь из памяти по адресу info->si_addr инструкцию вызвавшую сбой, проанализировать её длину и куда она записывает результат, записать в результат 0 и передвинуть адрес возврата. Но
это выглядит как неоправданное количество мороки.