49 lines · cpp
1// UNSUPPORTED: android2// UNSUPPORTED: hwasan3 4// RUN: %clangxx -O0 %s -o %t5 6// Sanitizer signal handler not installed; custom signal handler installed7// RUN: %env_tool_opts=handle_segv=0:cloak_sanitizer_signal_handlers=false not %run %t 2>&1 | FileCheck %s --check-prefixes=DEFAULT,CUSTOM8// RUN: %env_tool_opts=handle_segv=0:cloak_sanitizer_signal_handlers=true not %run %t 2>&1 | FileCheck %s --check-prefixes=DEFAULT,CUSTOM9 10// Sanitizer signal handler installed but overriden by custom signal handler11// RUN: %env_tool_opts=handle_segv=1:cloak_sanitizer_signal_handlers=false not %run %t 2>&1 | FileCheck %s --check-prefixes=NONDEFAULT,CUSTOM12// RUN: %env_tool_opts=handle_segv=1:cloak_sanitizer_signal_handlers=true not %run %t 2>&1 | FileCheck %s --check-prefixes=DEFAULT,CUSTOM13 14// Sanitizer signal handler installed immutably15// N.B. for handle_segv=2 with cloaking off, there is a pre-existing difference16// in signal vs. sigaction: signal effectively cloaks the handler.17// RUN: %env_tool_opts=handle_segv=2:cloak_sanitizer_signal_handlers=false not %run %t 2>&1 | FileCheck %s --check-prefixes=DEFAULT,SANITIZER18// RUN: %env_tool_opts=handle_segv=2:cloak_sanitizer_signal_handlers=true not %run %t 2>&1 | FileCheck %s --check-prefixes=DEFAULT,SANITIZER19 20#include <signal.h>21#include <stdio.h>22#include <stdlib.h>23 24void my_signal_sighandler(int signum) {25 printf("Custom signal handler\n");26 exit(1);27}28 29int main(int argc, char *argv[]) {30 __sighandler_t old = signal(SIGSEGV, &my_signal_sighandler);31 if (old == SIG_DFL)32 printf("Old handler: default\n");33 // DEFAULT: Old handler: default34 else35 printf("Old handler: non-default\n");36 // NONDEFAULT: Old handler: non-default37 38 fflush(stdout);39 40 // Trying to organically segfault by dereferencing a pointer can be tricky41 // in builds with assertions. Additionally, some older platforms may SIGBUS42 // instead.43 raise(SIGSEGV);44 // CUSTOM: Custom signal handler45 // SANITIZER: Sanitizer:DEADLYSIGNAL46 47 return 0;48}49