48 lines · cpp
1// RUN: %clangxx_msan -std=c++11 -O0 -g %s -o %t2// RUN: %run %t __3// RUN: not %run %t A_ 2>&1 | FileCheck %s4// RUN: not %run %t AH 2>&1 | FileCheck %s5// RUN: not %run %t B_ 2>&1 | FileCheck %s6// RUN: not %run %t BH 2>&1 | FileCheck %s7// RUN: not %run %t C_ 2>&1 | FileCheck %s8// RUN: not %run %t CH 2>&1 | FileCheck %s9 10#include <assert.h>11#include <signal.h>12#include <string.h>13#include <sys/time.h>14#include <unistd.h>15 16#include <sanitizer/msan_interface.h>17 18void handler(int) {}19void action(int, siginfo_t *, void *) {}20 21int main(int argc, char **argv) {22 char T = argv[1][0];23 char H = argv[1][1];24 struct sigaction sa;25 memset(&sa, 0, sizeof(sa));26 if (H == 'H') {27 sa.sa_handler = handler;28 } else {29 sa.sa_sigaction = action;30 sa.sa_flags = SA_SIGINFO;31 }32 33 if (T == 'A') {34 if (H == 'H')35 __msan_poison(&sa.sa_handler, sizeof(sa.sa_handler));36 else37 __msan_poison(&sa.sa_sigaction, sizeof(sa.sa_sigaction));38 }39 if (T == 'B')40 __msan_poison(&sa.sa_flags, sizeof(sa.sa_flags));41 if (T == 'C')42 __msan_poison(&sa.sa_mask, sizeof(sa.sa_mask));43 // CHECK: use-of-uninitialized-value44 int res = sigaction(SIGUSR1, &sa, nullptr);45 assert(res == 0);46 return 0;47}48