[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