llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-compiler-rt-sanitizer Author: Vitaly Buka (vitalybuka) <details> <summary>Changes</summary> 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. --- Full diff: https://github.com/llvm/llvm-project/pull/112037.diff 3 Files Affected: - (modified) compiler-rt/lib/lsan/lsan_common.cpp (+8-1) - (modified) compiler-rt/lib/lsan/lsan_flags.inc (+1) - (added) compiler-rt/test/lsan/TestCases/flag_retries.c (+23) ``````````diff 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); +} `````````` </details> https://github.com/llvm/llvm-project/pull/112037 _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits