Mercurial > hg > CbC > CbC_llvm
view compiler-rt/test/dfsan/sigaction_stress_test.c @ 222:81f6424ef0e3 llvm-original
LLVM original branch
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Sun, 18 Jul 2021 22:10:01 +0900 |
parents | 79ff65ed7e25 |
children | 5f17cb93ff66 |
line wrap: on
line source
// RUN: %clangxx_dfsan -mllvm -dfsan-fast-16-labels=true %s -o %t && %run %t // RUN: %clangxx_dfsan -mllvm -dfsan-track-origins=1 -mllvm -dfsan-fast-16-labels=true %s -o %t && %run %t // RUN: %clangxx_dfsan -mllvm -dfsan-track-origins=1 -mllvm -dfsan-fast-16-labels=true -mllvm -dfsan-instrument-with-call-threshold=0 %s -o %t && %run %t // // Test that the state of shadows from a sigaction handler are consistent. // // REQUIRES: x86_64-target-arch #include <signal.h> #include <stdarg.h> #include <sanitizer/dfsan_interface.h> #include <assert.h> #include <sys/time.h> #include <stdio.h> const int kSigCnt = 200; int x = 0; __attribute__((noinline)) int f(int a) { return a; } __attribute__((noinline)) void g() { int r = f(x); const dfsan_label r_label = dfsan_get_label(r); assert(r_label == 8 || r_label == 0); return; } int sigcnt; void SignalHandler(int signo) { assert(signo == SIGPROF); int a = 0; dfsan_set_label(4, &a, sizeof(a)); (void)f(a); ++sigcnt; } int main() { struct sigaction psa = {}; psa.sa_handler = SignalHandler; int r = sigaction(SIGPROF, &psa, NULL); itimerval itv; itv.it_interval.tv_sec = 0; itv.it_interval.tv_usec = 100; itv.it_value.tv_sec = 0; itv.it_value.tv_usec = 100; setitimer(ITIMER_PROF, &itv, NULL); dfsan_set_label(8, &x, sizeof(x)); do { g(); } while (sigcnt < kSigCnt); itv.it_interval.tv_sec = 0; itv.it_interval.tv_usec = 0; itv.it_value.tv_sec = 0; itv.it_value.tv_usec = 0; setitimer(ITIMER_PROF, &itv, NULL); signal(SIGPROF, SIG_DFL); return 0; }