aboutsummaryrefslogtreecommitdiffstats
path: root/tests/inc/test_utils.h
diff options
context:
space:
mode:
Diffstat (limited to 'tests/inc/test_utils.h')
-rw-r--r--tests/inc/test_utils.h12
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