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