[compiler-rt] r189943 - [asan] add a test that demonstrates why the current use-after-return is not signal-safe

Kostya Serebryany kcc at google.com
Wed Sep 4 07:39:43 PDT 2013


Author: kcc
Date: Wed Sep  4 09:39:43 2013
New Revision: 189943

URL: http://llvm.org/viewvc/llvm-project?rev=189943&view=rev
Log:
[asan] add a test that demonstrates why the current use-after-return is not signal-safe

Added:
    compiler-rt/trunk/lib/asan/lit_tests/TestCases/Linux/uar_signals.cc

Added: compiler-rt/trunk/lib/asan/lit_tests/TestCases/Linux/uar_signals.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/lit_tests/TestCases/Linux/uar_signals.cc?rev=189943&view=auto
==============================================================================
--- compiler-rt/trunk/lib/asan/lit_tests/TestCases/Linux/uar_signals.cc (added)
+++ compiler-rt/trunk/lib/asan/lit_tests/TestCases/Linux/uar_signals.cc Wed Sep  4 09:39:43 2013
@@ -0,0 +1,66 @@
+// This test shows that the current implementation of use-after-return is
+// not signal-safe.
+// RUN: %clangxx_asan -O1 %s -o %t -lpthread && %t
+// FAILS: %clangxx_asan -fsanitize=use-after-return -O1 %s -o %t -lpthread&& %t
+#include <signal.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <sys/time.h>
+#include <pthread.h>
+
+int *g;
+int n_signals;
+
+typedef void (*Sigaction)(int, siginfo_t *, void *);
+
+void SignalHandler(int, siginfo_t*, void*) {
+  int local;
+  g = &local;
+  n_signals++;
+  // printf("s: %p\n", &local);
+}
+
+static void EnableSigprof(Sigaction SignalHandler) {
+  struct sigaction sa;
+  sa.sa_sigaction = SignalHandler;
+  sa.sa_flags = SA_RESTART | SA_SIGINFO;
+  sigemptyset(&sa.sa_mask);
+  if (sigaction(SIGPROF, &sa, NULL) != 0) {
+    perror("sigaction");
+    abort();
+  }
+  struct itimerval timer;
+  timer.it_interval.tv_sec = 0;
+  timer.it_interval.tv_usec = 1;
+  timer.it_value = timer.it_interval;
+  if (setitimer(ITIMER_PROF, &timer, 0) != 0) {
+    perror("setitimer");
+    abort();
+  }
+}
+
+void RecursiveFunction(int depth) {
+  if (depth == 0) return;
+  int local;
+  g = &local;
+  // printf("r: %p\n", &local);
+  // printf("[%2d] n_signals: %d\n", depth, n_signals);
+  RecursiveFunction(depth - 1);
+  RecursiveFunction(depth - 1);
+}
+
+void *Thread(void *) {
+  RecursiveFunction(18);
+  return NULL;
+}
+
+int main(int argc, char **argv) {
+  EnableSigprof(SignalHandler);
+
+  const int kNumThread = 32;
+  pthread_t t[kNumThread];
+  for (int i = 0; i < kNumThread; i++)
+    pthread_create(&t[i], 0, Thread, 0);
+  for (int i = 0; i < kNumThread; i++)
+    pthread_join(t[i], 0);
+}





More information about the llvm-commits mailing list