Skip to content
Snippets Groups Projects

checkasm: Signal handling improvements

Merged Henrik Gramner requested to merge gramner/dav1d:checkasm_setjmp_ub into master
All threads resolved!
Files
2
+ 37
40
@@ -169,7 +169,7 @@ static struct {
unsigned seed;
CheckasmRunMode run_mode;
int verbose;
volatile sig_atomic_t catch_signals;
volatile sig_atomic_t sig; // SIG_ATOMIC_MAX = signal handling enabled
int suffix_length;
int max_function_name_length;
#if ARCH_X86_64
@@ -543,34 +543,33 @@ checkasm_context checkasm_context_buf;
#ifdef _WIN32
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
static LONG NTAPI signal_handler(EXCEPTION_POINTERS *const e) {
if (!state.catch_signals)
return EXCEPTION_CONTINUE_SEARCH;
int s;
switch (e->ExceptionRecord->ExceptionCode) {
case EXCEPTION_FLT_DIVIDE_BY_ZERO:
case EXCEPTION_INT_DIVIDE_BY_ZERO:
s = SIGFPE;
break;
case EXCEPTION_ILLEGAL_INSTRUCTION:
case EXCEPTION_PRIV_INSTRUCTION:
s = SIGILL;
break;
case EXCEPTION_ACCESS_VIOLATION:
case EXCEPTION_ARRAY_BOUNDS_EXCEEDED:
case EXCEPTION_DATATYPE_MISALIGNMENT:
case EXCEPTION_STACK_OVERFLOW:
s = SIGSEGV;
break;
case EXCEPTION_IN_PAGE_ERROR:
s = SIGBUS;
break;
default:
return EXCEPTION_CONTINUE_SEARCH;
if (state.sig == SIG_ATOMIC_MAX) {
int s;
switch (e->ExceptionRecord->ExceptionCode) {
case EXCEPTION_FLT_DIVIDE_BY_ZERO:
case EXCEPTION_INT_DIVIDE_BY_ZERO:
s = SIGFPE;
break;
case EXCEPTION_ILLEGAL_INSTRUCTION:
case EXCEPTION_PRIV_INSTRUCTION:
s = SIGILL;
break;
case EXCEPTION_ACCESS_VIOLATION:
case EXCEPTION_ARRAY_BOUNDS_EXCEEDED:
case EXCEPTION_DATATYPE_MISALIGNMENT:
case EXCEPTION_STACK_OVERFLOW:
s = SIGSEGV;
break;
case EXCEPTION_IN_PAGE_ERROR:
s = SIGBUS;
break;
default:
return EXCEPTION_CONTINUE_SEARCH;
}
state.sig = s;
checkasm_load_context();
}
state.catch_signals = 0;
checkasm_load_context(s);
return EXCEPTION_CONTINUE_EXECUTION; /* never reached, but shuts up gcc */
return EXCEPTION_CONTINUE_SEARCH;
}
#endif
#else
@@ -582,10 +581,10 @@ static const struct sigaction signal_handler_act = {
};
static void signal_handler(const int s) {
if (state.catch_signals) {
state.catch_signals = 0;
if (state.sig == SIG_ATOMIC_MAX) {
state.sig = s;
sigaction(s, &signal_handler_act, NULL);
checkasm_load_context(s);
checkasm_load_context();
}
}
#endif
@@ -1018,17 +1017,15 @@ void checkasm_report(const char *const name, ...) {
}
void checkasm_set_signal_handler_state(const int enabled) {
state.catch_signals = enabled;
state.sig = enabled ? SIG_ATOMIC_MAX : 0;
}
int checkasm_handle_signal(const int s) {
if (s) {
checkasm_fail_func(s == SIGFPE ? "fatal arithmetic error" :
s == SIGILL ? "illegal instruction" :
s == SIGBUS ? "bus error" :
"segmentation fault");
}
return s;
void checkasm_handle_signal(void) {
const int s = state.sig;
checkasm_fail_func(s == SIGFPE ? "fatal arithmetic error" :
s == SIGILL ? "illegal instruction" :
s == SIGBUS ? "bus error" :
"segmentation fault");
}
static int check_err(const char *const file, const int line,
Loading