1 // RUN: %clangxx_msan -std=c++11 -O0 -g %s -o %t && %run %t
2 // RUN: %clangxx_msan -DPOSITIVE -std=c++11 -O0 -g %s -o %t && not %run %t 2>&1 | FileCheck %s
3 
4 #include <assert.h>
5 #include <signal.h>
6 #include <sys/time.h>
7 #include <sys/wait.h>
8 #include <unistd.h>
9 
10 #include <sanitizer/msan_interface.h>
11 
test_sigwait()12 void test_sigwait() {
13   sigset_t s;
14 #ifndef POSITIVE
15   sigemptyset(&s);
16   sigaddset(&s, SIGUSR1);
17 #endif
18   sigprocmask(SIG_BLOCK, &s, 0);
19   // CHECK:  MemorySanitizer: use-of-uninitialized-value
20 
21   if (pid_t pid = fork()) {
22     kill(pid, SIGUSR1);
23     int child_stat;
24     wait(&child_stat);
25     _exit(!WIFEXITED(child_stat));
26   } else {
27     int sig;
28     int res = sigwait(&s, &sig);
29     assert(!res);
30     // The following checks that sig is initialized.
31     assert(sig == SIGUSR1);
32   }
33 }
34 
main(void)35 int main(void) {
36   test_sigwait();
37   return 0;
38 }
39