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