diff options
| author | Mattias Andrée <m@maandree.se> | 2026-03-20 23:35:38 +0100 |
|---|---|---|
| committer | Mattias Andrée <m@maandree.se> | 2026-03-20 23:37:25 +0100 |
| commit | db49c933fe34a54947dbc7df381fa1700dc1e74f (patch) | |
| tree | 7f59c27e6187c8ed4614101916e7bee66a7a0ecf /sigsegv-recovery.c | |
| download | sigsegv-recovery-master.tar.gz sigsegv-recovery-master.tar.bz2 sigsegv-recovery-master.tar.xz | |
Signed-off-by: Mattias Andrée <m@maandree.se>
Diffstat (limited to 'sigsegv-recovery.c')
| -rw-r--r-- | sigsegv-recovery.c | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/sigsegv-recovery.c b/sigsegv-recovery.c new file mode 100644 index 0000000..b69449b --- /dev/null +++ b/sigsegv-recovery.c @@ -0,0 +1,46 @@ +/* See LICENSE file for copyright and license details. */ +#include <setjmp.h> +#include <signal.h> +#include <stddef.h> +#include <stdio.h> +#include <string.h> + + +int *volatile just_null = NULL; + +static jmp_buf jmpenv; + + +static void +sigsegv(int signo) +{ + (void) signo; + + siglongjmp(jmpenv, 1); +} + + +int +main(void) +{ + volatile int sum = 0; + volatile int i; + struct sigaction sa; + + memset(&sa, 0, sizeof(sa)); + sa.sa_handler = &sigsegv; + sigfillset(&sa.sa_mask); + sigaction(SIGSEGV, &sa, NULL); + + for (i = 1; i <= 10; i++) { + if (!sigsetjmp(jmpenv, 1)) { + printf("%i: before null dereference\n", i); + sum += *just_null; + } else { + printf("%i: after null dereference\n", i); + } + } + + fflush(stdout); + return sum; +} |
