Я хочу, чтобы мой код завершился при ошибке с плавающей запятой. В linux-gcc функция feenableexcept() выполняет задание, но недоступна в OSX. При использовании gcc на OS X подход, принятый в (Enabling floating point interrupts on Mac OS X Intel), отлично работает при использовании gcc, но не работает при использовании clang.Как включить исключения с плавающей запятой для clang в OS X?
Пример кода:
#include <stdio.h>
#include <execinfo.h>
#include <signal.h>
#include <stdlib.h>
#include <unistd.h>
#include <iostream>
#include <xmmintrin.h>
void handler(int sig) {
void *array[10];
size_t size;
size = backtrace(array, 10);
fprintf(stderr, "Error: signal %d:\n", sig);
backtrace_symbols_fd(array, size, STDERR_FILENO);
exit(1);
}
int main(int argc, char **argv)
{
_MM_SET_EXCEPTION_MASK((_MM_EXCEPT_INVALID |
_MM_EXCEPT_DENORM |
_MM_EXCEPT_DIV_ZERO |
_MM_EXCEPT_OVERFLOW |
_MM_EXCEPT_UNDERFLOW |
_MM_EXCEPT_INEXACT));
signal(SIGSEGV, handler);
signal(SIGFPE, handler);
std::cout<<"Perform 1.0/0.0"<<std::endl;
double a = 1.0/0.0;
std::cout<<"1.0/0.0 didn't kill program, result is "<<a<<std::endl<<std::endl;
int* foo = (int*) - 1 ;// make a bad pointer
std::cout<<"Attempting to print a bad pointer"<<std::endl;
printf("%d\n", *foo);
std::cout<<"Bad pointer didn't kill program."<<std::ends;
}
При скомпилированы с использованием gcc5, результат:
Perform 1.0/0.0
Error: signal 8:
0 a.out 0x000000010f97cb7f _Z7handleri + 28
1 libsystem_platform.dylib 0x00007fff895c652a _sigtramp + 26
2 ??? 0x00007fff6eab6568 0x0 + 140735050114408
3 libdyld.dylib 0x00007fff936a15ad start + 1
Замечательно. Прекрасно работает. Однако, при компиляции с использованием лязга (Apple LLVM версии 7.3.0 (лязг-703.0.29)) результат заключается в следующем:
Perform 1.0/0.0
1.0/0.0 didn't kill program, result is inf
Attempting to print a bad pointer
Error: signal 11:
0 a.out 0x000000010d501d1f _Z7handleri + 31
1 libsystem_platform.dylib 0x00007fff895c652a _sigtramp + 26
2 ??? 0x00007fff62b7e568 0x0 + 140734849607016
3 libdyld.dylib 0x00007fff936a15ad start + 1
Не велик. Не поднимал FPE, и код просто продолжал напрягаться. Я огляделся и не могу найти, как получить clang, чтобы поднять FPE. У кого-нибудь есть опыт? Благодаря!
Возможный дубликат [Включение с плавающей точкой прерывания на Mac OS X Intel] (http://stackoverflow.com/questions/247053/enabling-floating-point-interrupts-on- mac-os-x-intel) – nwellnhof
@nwellnhof подход в связанном вопросе не работает с clang. – doc07b5