1 // Check that stores in signal handlers are not recorded in origin history. 2 // This is, in fact, undesired behavior caused by our chained origins 3 // implementation being not async-signal-safe. 4 5 // RUN: %clangxx_msan -fsanitize-memory-track-origins=2 -m64 -O3 %s -o %t && \ 6 // RUN: not %run %t >%t.out 2>&1 7 // RUN: FileCheck %s < %t.out 8 9 // RUN: %clangxx_msan -mllvm -msan-instrumentation-with-call-threshold=0 -fsanitize-memory-track-origins=2 -m64 -O3 %s -o %t && \ 10 // RUN: not %run %t >%t.out 2>&1 11 // RUN: FileCheck %s < %t.out 12 13 #include <signal.h> 14 #include <stdio.h> 15 #include <sys/types.h> 16 #include <unistd.h> 17 18 volatile int x, y; 19 20 void SignalHandler(int signo) { 21 y = x; 22 } 23 24 int main(int argc, char *argv[]) { 25 int volatile z; 26 x = z; 27 28 signal(SIGUSR1, SignalHandler); 29 kill(getpid(), SIGUSR1); 30 signal(SIGUSR1, SIG_DFL); 31 32 return y; 33 } 34 35 // CHECK: WARNING: MemorySanitizer: use-of-uninitialized-value 36 // CHECK-NOT: in SignalHandler 37