diff --git a/compiler-rt/lib/rtsan/rtsan.cpp b/compiler-rt/lib/rtsan/rtsan.cpp index 70edcc546219f..81cedb3b5114f 100644 --- a/compiler-rt/lib/rtsan/rtsan.cpp +++ b/compiler-rt/lib/rtsan/rtsan.cpp @@ -55,11 +55,7 @@ static void OnViolation(const BufferedStackTrace &stack, StackDepotHandle handle = StackDepotPut_WithHandle(stack); const bool is_stack_novel = handle.use_count() == 0; - - // Marked UNLIKELY as if user is runing with halt_on_error=false - // we expect a high number of duplicate stacks. We are willing - // To pay for the first insertion. - if (UNLIKELY(is_stack_novel)) { + if (is_stack_novel || !flags().suppress_equal_stacks) { IncrementUniqueErrorCount(); { diff --git a/compiler-rt/lib/rtsan/rtsan_flags.inc b/compiler-rt/lib/rtsan/rtsan_flags.inc index 5c3eb3f53a5eb..104fac8f77040 100644 --- a/compiler-rt/lib/rtsan/rtsan_flags.inc +++ b/compiler-rt/lib/rtsan/rtsan_flags.inc @@ -19,3 +19,6 @@ RTSAN_FLAG(bool, halt_on_error, true, "Exit after first reported error.") RTSAN_FLAG(bool, print_stats_on_exit, false, "Print stats on exit.") RTSAN_FLAG(const char *, suppressions, "", "Suppressions file name.") +RTSAN_FLAG(bool, suppress_equal_stacks, true, + "Suppress a report if we've already output another report " + "with the same stack.") diff --git a/compiler-rt/test/rtsan/deduplicate_errors.cpp b/compiler-rt/test/rtsan/deduplicate_errors.cpp index 7d60d4d7da7dd..6fcd749cf63ee 100644 --- a/compiler-rt/test/rtsan/deduplicate_errors.cpp +++ b/compiler-rt/test/rtsan/deduplicate_errors.cpp @@ -1,5 +1,6 @@ // RUN: %clangxx -fsanitize=realtime %s -o %t // RUN: env RTSAN_OPTIONS="halt_on_error=false,print_stats_on_exit=true" %run %t 2>&1 | FileCheck %s +// RUN: env RTSAN_OPTIONS="halt_on_error=false,suppress_equal_stacks=false" %run %t 2>&1 | FileCheck %s --check-prefix=CHECK-DUPLICATES // UNSUPPORTED: ios @@ -37,3 +38,6 @@ int main() { // CHECK: RealtimeSanitizer exit stats: // CHECK-NEXT: Total error count: 220 // CHECK-NEXT: Unique error count: 4 + +// CHECK-DUPLICATES-COUNT-220: ==ERROR: +// CHECK-DUPLICATES-NOT: ==ERROR: