Я читаю этот а также этот. Квинтэссенция заключается в том, что можно генерировать SIGFPE, если создается Nan, включив fenv.h и включив все исключения с плавающей запятой, кроме FE_INEXACT
от feenableexcept(FE_ALL_EXCEPT & ~FE_INEXACT);
Таким образом, код меняет форму
int main () {
double dirty = 0.0;
double nanvalue = 0.0/dirty;
return 0;
}
в
#include <fenv.h>
int main () {
feenableexcept(FE_ALL_EXCEPT & ~FE_INEXACT); // Enable all floating point exceptions but FE_INEXACT
double dirty = 0.0;
double nanvalue = 0.0/dirty;
return 0;
}
Это прекрасно работает, но вы должны изменить код. У меня проблема в том, что в огромной кодовой базе c и c ++ где-то создается nan, и я не знаю где. Это не вариант применить вышеупомянутое изменение к файлам и
отследить ошибку.
Есть ли способ включить все исключения с плавающей запятой, БЕЗ изменения кода? Есть ли опция компиляции, о которой я не знаю?
Мы используем компилятор intel icc версии 15.0.3.
Независимо от того, сколько файлов охватывает ваш код, вам нужно только добавить feenableexcept(FE_ALL_EXCEPT & ~FE_INEXACT)
один раз только в первой строке вашего main()
функция.
Он будет включать исключения для всей вашей программы, пока вы не отключите исключения, вызвав другую функцию, такую как fedisableexcept()
,
Других решений пока нет …