diff options
Diffstat (limited to 'tests/inc')
| -rw-r--r-- | tests/inc/test_utils.h | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/tests/inc/test_utils.h b/tests/inc/test_utils.h index 0cb6655..56dbb94 100644 --- a/tests/inc/test_utils.h +++ b/tests/inc/test_utils.h @@ -115,21 +115,29 @@ _s_check_eq_int (const char *label, int got, int expected) /* ── crash detection ──────────────────────────────────────────────── */ -/** Run @p fn in a child process; return 1 if it was killed by a signal. */ +/** + * Run @p fn in a child process; return 1 if it crashed. + * Detects both raw signals (SEGV, BUS) and ASan-intercepted crashes + * (which exit with non-zero instead of being killed by a signal). + */ static int _s_crashes (void (*fn) (void)) { pid_t pid; int status; + fflush (stdout); pid = fork (); if (pid == 0) { + /* Suppress ASan crash reports from intentional NULL dereferences. */ + close (STDERR_FILENO); fn (); _exit (0); } waitpid (pid, &status, 0); - return (WIFSIGNALED (status)); + return (WIFSIGNALED (status) + || (WIFEXITED (status) && WEXITSTATUS (status) != 0)); } static void |
