exception_signal.cxx [plain text]
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <new>
void segfault(int sig)
{
::signal(SIGBUS, SIG_DFL);
::signal(SIGSEGV, SIG_DFL);
throw "seg fault";
}
__attribute__((noinline)) void boom(int* p)
{
int* x = new int[100];
*x = *p;
}
int main()
{
::signal(SIGBUS, segfault);
::signal(SIGSEGV, segfault);
int state = 1;
try {
state = 2;
boom(NULL);
state = 3;
}
catch (const char* msg) {
if ( state != 2 )
exit(1);
state = 4;
}
catch(...) {
exit(1);
}
if ( state == 4 )
return 0;
else
return 1;
}