12d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// Check that stores in signal handlers are not recorded in origin history.
22d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// This is, in fact, undesired behavior caused by our chained origins
32d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// implementation being not async-signal-safe.
42d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
52d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %clangxx_msan -fsanitize-memory-track-origins=2 -m64 -O3 %s -o %t && \
62d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN:     not %run %t >%t.out 2>&1
72d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: FileCheck %s < %t.out
82d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
95d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// RUN: %clangxx_msan -mllvm -msan-instrumentation-with-call-threshold=0 -fsanitize-memory-track-origins=2 -m64 -O3 %s -o %t && \
105d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// RUN:     not %run %t >%t.out 2>&1
115d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// RUN: FileCheck %s < %t.out
125d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines
132d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include <signal.h>
142d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include <stdio.h>
152d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include <sys/types.h>
162d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include <unistd.h>
172d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
182d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvolatile int x, y;
192d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
202d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid SignalHandler(int signo) {
212d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  y = x;
222d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
232d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
242d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesint main(int argc, char *argv[]) {
252d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  int volatile z;
262d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  x = z;
272d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
282d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  signal(SIGUSR1, SignalHandler);
292d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  kill(getpid(), SIGUSR1);
302d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  signal(SIGUSR1, SIG_DFL);
312d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
322d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  return y;
332d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
342d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
352d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// CHECK: WARNING: MemorySanitizer: use-of-uninitialized-value
362d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// CHECK-NOT: in SignalHandler
37