[compiler-rt] r269288 - [sanitizer] Break infinite recursion in case of recursive failed CHECKs

Kuba Brecka via llvm-commits llvm-commits at lists.llvm.org
Thu May 12 05:49:53 PDT 2016


Author: kuba.brecka
Date: Thu May 12 07:49:53 2016
New Revision: 269288

URL: http://llvm.org/viewvc/llvm-project?rev=269288&view=rev
Log:
[sanitizer] Break infinite recursion in case of recursive failed CHECKs

While debugging ASan and TSan, I sometimes get a recursion during a failed CHECK processing.  CheckFailed can call a lot of code (printing, unwinding a stack trace, symbolicating, ...) and this can fail another CHECK. This means I sometimes see a crash due to a infinite recursion stack overflow. Let's stop after 10 failed CHECKs and just kill the process immediately. I also added a Sleep(2) call before the trap, so that other threads still get a chance to print their failed CHECKs.

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


Modified:
    compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.cc

Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.cc?rev=269288&r1=269287&r2=269288&view=diff
==============================================================================
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.cc (original)
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.cc Thu May 12 07:49:53 2016
@@ -153,8 +153,16 @@ void SetCheckFailedCallback(CheckFailedC
   CheckFailedCallback = callback;
 }
 
+const int kSecondsToSleepWhenRecursiveCheckFailed = 2;
+
 void NORETURN CheckFailed(const char *file, int line, const char *cond,
                           u64 v1, u64 v2) {
+  static atomic_uint32_t num_calls;
+  if (atomic_fetch_add(&num_calls, 1, memory_order_relaxed) > 10) {
+    SleepForSeconds(kSecondsToSleepWhenRecursiveCheckFailed);
+    Trap();
+  }
+
   if (CheckFailedCallback) {
     CheckFailedCallback(file, line, cond, v1, v2);
   }




More information about the llvm-commits mailing list