[compiler-rt] r268713 - [asan] Bail out on stack overflow in recovery mode.

Maxim Ostapenko via llvm-commits llvm-commits at lists.llvm.org
Fri May 6 00:09:22 PDT 2016


Author: chefmax
Date: Fri May  6 02:09:22 2016
New Revision: 268713

URL: http://llvm.org/viewvc/llvm-project?rev=268713&view=rev
Log:
[asan] Bail out on stack overflow in recovery mode.

In recovery mode, when ASan detects stack overflow (say, when infinite recursion detected),
it tries to continue program execution and hangs on repetitive error reports. There isn't any
sense to do it, we can just bail out on stack overflow error, because the program would crash soon anyway.

Differential Revision: http://reviews.llvm.org/D19958

Added:
    compiler-rt/trunk/test/asan/TestCases/Linux/stack-overflow-recovery-mode.cc
Modified:
    compiler-rt/trunk/lib/asan/asan_report.cc

Modified: compiler-rt/trunk/lib/asan/asan_report.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_report.cc?rev=268713&r1=268712&r2=268713&view=diff
==============================================================================
--- compiler-rt/trunk/lib/asan/asan_report.cc (original)
+++ compiler-rt/trunk/lib/asan/asan_report.cc Fri May  6 02:09:22 2016
@@ -739,7 +739,7 @@ StaticSpinMutex ScopedInErrorReport::loc
 u32 ScopedInErrorReport::reporting_thread_tid_;
 
 void ReportStackOverflow(const SignalContext &sig) {
-  ScopedInErrorReport in_report;
+  ScopedInErrorReport in_report(/*report*/ nullptr, /*fatal*/ true);
   Decorator d;
   Printf("%s", d.Warning());
   Report(

Added: compiler-rt/trunk/test/asan/TestCases/Linux/stack-overflow-recovery-mode.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/asan/TestCases/Linux/stack-overflow-recovery-mode.cc?rev=268713&view=auto
==============================================================================
--- compiler-rt/trunk/test/asan/TestCases/Linux/stack-overflow-recovery-mode.cc (added)
+++ compiler-rt/trunk/test/asan/TestCases/Linux/stack-overflow-recovery-mode.cc Fri May  6 02:09:22 2016
@@ -0,0 +1,36 @@
+// Test that ASan doesn't hang on stack overflow in recovery mode.
+//
+// RUN: %clang_asan -O0 -fsanitize-recover=address %s -o %t
+// RUN: %env_asan_opts=halt_on_error=false not %run %t 2>&1 | FileCheck %s
+
+#include <assert.h>
+#include <unistd.h>
+#include <sys/mman.h>
+#include <sys/resource.h>
+
+static volatile int *recurse(volatile int n, volatile int *p) {
+  // CHECK: {{stack-overflow on address 0x.* \(pc 0x.* bp 0x.* sp 0x.* T.*\)}}
+  if (n >= 0) *recurse(n + 1, p) += n;
+  return p;
+}
+
+
+void LimitStackAndReexec(int argc, char **argv) {
+  struct rlimit rlim;
+  int res = getrlimit(RLIMIT_STACK, &rlim);
+  assert(res == 0);
+  if (rlim.rlim_cur == RLIM_INFINITY) {
+    rlim.rlim_cur = 256 * 1024;
+    res = setrlimit(RLIMIT_STACK, &rlim);
+    assert(res == 0);
+
+    execv(argv[0], argv);
+    assert(0 && "unreachable");
+  }
+}
+
+int main(int argc, char **argv) {
+  LimitStackAndReexec(argc, argv);
+  volatile int res;
+  return *recurse(argc + 1, &res);
+}




More information about the llvm-commits mailing list