brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.1 KiB · 5b22d06 Raw
49 lines · c
1// RUN: %clang_dfsan -DUSE_SIGNAL_ACTION -Wno-error=int-conversion %s -o %t && %run %t2// RUN: %clang_dfsan -Wno-error=int-conversion %s -o %t && %run %t3 4#include <sanitizer/dfsan_interface.h>5 6#include <assert.h>7#include <signal.h>8#include <string.h>9#include <sys/types.h>10#include <unistd.h>11 12volatile int x;13volatile int z = 1;14 15void SignalHandler(int signo) {16  assert(dfsan_get_label(signo) == 0);17  x = z;18}19 20void SignalAction(int signo, siginfo_t *si, void *uc) {21  assert(dfsan_get_label(signo) == 0);22  assert(dfsan_get_label(si) == 0);23  assert(dfsan_get_label(uc) == 0);24  assert(0 == dfsan_read_label(si, sizeof(*si)));25  assert(0 == dfsan_read_label(uc, sizeof(ucontext_t)));26  x = z;27}28 29int main(int argc, char *argv[]) {30  dfsan_set_label(8, (void *)&z, sizeof(z));31 32  struct sigaction sa = {};33#ifdef USE_SIGNAL_ACTION34  sa.sa_flags = SA_SIGINFO;35  sa.sa_sigaction = SignalAction;36#else37  sa.sa_handler = SignalHandler;38#endif39  int r = sigaction(SIGHUP, &sa, NULL);40  assert(dfsan_get_label(r) == 0);41 42  kill(getpid(), SIGHUP);43  signal(SIGHUP, SIG_DFL);44 45  assert(x == 1);46 47  return 0;48}49