-
Notifications
You must be signed in to change notification settings - Fork 12.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[lsan] Add debug option to "deflake" leaks #112037
[lsan] Add debug option to "deflake" leaks #112037
Conversation
Created using spr 1.3.4
Created using spr 1.3.4 [skip ci]
@llvm/pr-subscribers-compiler-rt-sanitizer Author: Vitaly Buka (vitalybuka) ChangesThere are hard to debug leaks which look like In general, repeating leak checking should not But if we see significant discrepancy, it may give Full diff: https://github.com/llvm/llvm-project/pull/112037.diff 3 Files Affected:
diff --git a/compiler-rt/lib/lsan/lsan_common.cpp b/compiler-rt/lib/lsan/lsan_common.cpp
index b584d1e9723fc8..8ed2cfc63cbae9 100644
--- a/compiler-rt/lib/lsan/lsan_common.cpp
+++ b/compiler-rt/lib/lsan/lsan_common.cpp
@@ -779,7 +779,7 @@ static bool PrintResults(LeakReport &report) {
return unsuppressed_count;
}
-static bool CheckForLeaks() {
+static bool CheckForLeaksOnce() {
if (&__lsan_is_turned_off && __lsan_is_turned_off()) {
VReport(1, "LeakSanitizer is disabled\n");
return false;
@@ -831,6 +831,13 @@ static bool CheckForLeaks() {
}
}
+static bool CheckForLeaks() {
+ int with_leaks = 0;
+ for (int i = 0; i < flags()->retries; ++i)
+ with_leaks += CheckForLeaksOnce();
+ return with_leaks == flags()->retries;
+}
+
static bool has_reported_leaks = false;
bool HasReportedLeaks() { return has_reported_leaks; }
diff --git a/compiler-rt/lib/lsan/lsan_flags.inc b/compiler-rt/lib/lsan/lsan_flags.inc
index b7f28223b8189b..59edc0baa77d85 100644
--- a/compiler-rt/lib/lsan/lsan_flags.inc
+++ b/compiler-rt/lib/lsan/lsan_flags.inc
@@ -43,6 +43,7 @@ LSAN_FLAG(bool, use_poisoned, false,
"Consider pointers found in poisoned memory to be valid.")
LSAN_FLAG(bool, log_pointers, false, "Debug logging")
LSAN_FLAG(bool, log_threads, false, "Debug logging")
+LSAN_FLAG(int, retries, 1, "Debug option to repeat leak checking multiple times")
LSAN_FLAG(const char *, suppressions, "", "Suppressions file name.")
LSAN_FLAG(int, thread_suspend_fail, 1,
"Behaviour if thread suspendion all thread (0 - "
diff --git a/compiler-rt/test/lsan/TestCases/flag_retries.c b/compiler-rt/test/lsan/TestCases/flag_retries.c
new file mode 100644
index 00000000000000..3891a47bb0a566
--- /dev/null
+++ b/compiler-rt/test/lsan/TestCases/flag_retries.c
@@ -0,0 +1,23 @@
+// Test retries option of lsan.
+// RUN: %clang_lsan %s -o %t
+// RUN: %env_lsan_opts=use_stacks=0:use_registers=0:symbolize=0 %run %t foo 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK1
+// RUN: %env_lsan_opts=use_stacks=0:use_registers=0:symbolize=0:retries=12 %run %t 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK12
+
+#include <assert.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sanitizer/lsan_interface.h>
+
+void *p;
+
+int main(int argc, char *argv[]) {
+ fprintf(stderr, "Test alloc: %p.\n", malloc(1337));
+// CHECK: Test alloc:
+
+ assert(__lsan_do_recoverable_leak_check() == 1);
+// CHECK1-COUNT-1: SUMMARY: {{.*}}Sanitizer: 1337 byte
+// CHECK12-COUNT-12: SUMMARY: {{.*}}Sanitizer: 1337 byte
+
+ _exit(0);
+}
|
✅ With the latest revision this PR passed the C/C++ code formatter. |
Created using spr 1.3.4 [skip ci]
Created using spr 1.3.4 [skip ci]
There are hard to debug leaks which look like false. In general, repeating leak checking should not affect set of leaks significantly, especial `at_exit` leak checking. But if we see significant discrepancy, it may give us a clue for investigation.
There are hard to debug leaks which look like false. In general, repeating leak checking should not affect set of leaks significantly, especial `at_exit` leak checking. But if we see significant discrepancy, it may give us a clue for investigation.
There are hard to debug leaks which look like false. In general, repeating leak checking should not affect set of leaks significantly, especial `at_exit` leak checking. But if we see significant discrepancy, it may give us a clue for investigation.
There are hard to debug leaks which look like
false.
In general, repeating leak checking should not
affect set of leaks significantly, especial
at_exit
leak checking.But if we see significant discrepancy, it may give
us a clue for investigation.