]>
git.proxmox.com Git - rustc.git/blob - src/compiler-rt/test/msan/signal_stress_test.cc
1 // RUN: %clangxx_msan -std=c++11 -O0 %s -o %t && %run %t
3 // Test that va_arg shadow from a signal handler does not leak outside.
7 #include <sanitizer/msan_interface.h>
12 const int kSigCnt
= 200;
14 void f(bool poisoned
, int n
, ...) {
17 for (int i
= 0; i
< n
; ++i
) {
18 void *p
= va_arg(vl
, void *);
20 assert(__msan_test_shadow(&p
, sizeof(p
)) == -1);
27 void SignalHandler(int signo
) {
28 assert(signo
== SIGPROF
);
30 void **volatile q
= &p
;
38 signal(SIGPROF
, SignalHandler
);
41 itv
.it_interval
.tv_sec
= 0;
42 itv
.it_interval
.tv_usec
= 100;
43 itv
.it_value
.tv_sec
= 0;
44 itv
.it_value
.tv_usec
= 100;
45 setitimer(ITIMER_PROF
, &itv
, NULL
);
48 void **volatile q
= &p
;
52 nullptr, nullptr, nullptr, nullptr, nullptr,
53 nullptr, nullptr, nullptr, nullptr, nullptr,
54 nullptr, nullptr, nullptr, nullptr, nullptr,
55 nullptr, nullptr, nullptr, nullptr, nullptr);
61 } while (sigcnt
< kSigCnt
);
63 itv
.it_interval
.tv_sec
= 0;
64 itv
.it_interval
.tv_usec
= 0;
65 itv
.it_value
.tv_sec
= 0;
66 itv
.it_value
.tv_usec
= 0;
67 setitimer(ITIMER_PROF
, &itv
, NULL
);
69 signal(SIGPROF
, SIG_DFL
);