// RUN: %clangxx_msan -std=c++11 -O0 -g %s -o %t // RUN: %run %t __ // RUN: not %run %t A_ 2>&1 | FileCheck %s // RUN: not %run %t AH 2>&1 | FileCheck %s // RUN: not %run %t B_ 2>&1 | FileCheck %s // RUN: not %run %t BH 2>&1 | FileCheck %s // RUN: not %run %t C_ 2>&1 | FileCheck %s // RUN: not %run %t CH 2>&1 | FileCheck %s #include #include #include #include #include #include void handler(int) {} void action(int, siginfo_t *, void *) {} int main(int argc, char **argv) { char T = argv[1][0]; char H = argv[1][1]; struct sigaction sa; memset(&sa, 0, sizeof(sa)); if (H == 'H') { sa.sa_handler = handler; } else { sa.sa_sigaction = action; sa.sa_flags = SA_SIGINFO; } if (T == 'A') { if (H == 'H') __msan_poison(&sa.sa_handler, sizeof(sa.sa_handler)); else __msan_poison(&sa.sa_sigaction, sizeof(sa.sa_sigaction)); } if (T == 'B') __msan_poison(&sa.sa_flags, sizeof(sa.sa_flags)); if (T == 'C') __msan_poison(&sa.sa_mask, sizeof(sa.sa_mask)); // CHECK: use-of-uninitialized-value int res = sigaction(SIGUSR1, &sa, nullptr); assert(res == 0); return 0; }