16 static volatile uint64_t
sink;
18 static sigjmp_buf
sjb;
21 __asm__ __volatile__(
"" :::
"memory");
sink ^= (uint64_t)i;
23 extern "C" __attribute__((noinline))
void sigsegv_recover_marker(
int i) {
24 __asm__ __volatile__(
"" :::
"memory");
sink ^= (uint64_t)i << 8;
34 volatile int* bad = (
volatile int*)(uintptr_t)0x1;
39 int main(
int argc,
char** argv) {
40 (void)argc; (void)argv;
42 memset(&sa, 0,
sizeof(sa));
44 sa.sa_flags = SA_NODEFER;
45 sigaction(SIGSEGV, &sa,
nullptr);
48 for (
int i = 0; i <
ITERS; ++i) {
49 if (sigsetjmp(
sjb, 1) == 0) {
50 sigsegv_try_marker(i);
53 sigsegv_recover_marker(i);
59 fprintf(stderr,
"sig_sigsegv_recover: recovered=%d iters=%d sink=%llx\n",
60 recovered,
ITERS, (
unsigned long long)
sink);
61 return recovered ==
ITERS ? 0 : 1;
int main(int argc, char **argv)
static uint64_t buf[ITERS]
__attribute__((noinline)) void sigsegv_try_marker(int i)
static volatile uint64_t sink