]>
git.proxmox.com Git - rustc.git/blob - src/compiler-rt/test/tsan/signal_longjmp.cc
1 // RUN: %clang_tsan -O1 %s -o %t && %run %t 2>&1 | FileCheck %s
3 // Test case for longjumping out of signal handler:
4 // https://code.google.com/p/thread-sanitizer/issues/detail?id=75
6 // Longjmp assembly has not been implemented for mips64 or aarch64 yet
17 volatile int fault_expected
;
19 void sigfault_handler(int sig
) {
23 /* just return from sighandler to proper place */
25 siglongjmp(fault_jmp
, 1);
28 #define MUST_FAULT(code) do { \
30 if (!sigsetjmp(fault_jmp, 1)) { \
31 code; /* should pagefault -> sihandler does longjmp */ \
32 fprintf(stderr, "%s not faulted\n", #code); \
35 fprintf(stderr, "%s faulted ok\n", #code); \
41 act
.sa_handler
= sigfault_handler
;
43 if (sigemptyset(&act
.sa_mask
)) {
44 perror("sigemptyset");
48 if (sigaction(SIGSEGV
, &act
, NULL
)) {
53 void *mem
= mmap(0, 4096, PROT_NONE
, MAP_PRIVATE
| MAP_ANON
,
56 MUST_FAULT(((volatile int *volatile)mem
)[0] = 0);
57 MUST_FAULT(((volatile int *volatile)mem
)[1] = 1);
58 MUST_FAULT(((volatile int *volatile)mem
)[3] = 1);
60 // Ensure that tsan does not think that we are
61 // in a signal handler.
62 void *volatile p
= malloc(10);
63 ((volatile int*)p
)[1] = 1;
68 fprintf(stderr
, "DONE\n");
72 // CHECK-NOT: WARNING: ThreadSanitizer