Home | History | Annotate | Download | only in msan
      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