[compiler-rt] 1efa662 - [rtsan] Introduce function-name-matches suppression (#112108)
via llvm-commits
llvm-commits at lists.llvm.org
Wed Oct 16 16:38:16 PDT 2024
Author: Chris Apple
Date: 2024-10-16T16:38:14-07:00
New Revision: 1efa6625ef145624f7134bcb957f8ffa19c3c68e
URL: https://github.com/llvm/llvm-project/commit/1efa6625ef145624f7134bcb957f8ffa19c3c68e
DIFF: https://github.com/llvm/llvm-project/commit/1efa6625ef145624f7134bcb957f8ffa19c3c68e.diff
LOG: [rtsan] Introduce function-name-matches suppression (#112108)
Introduces a new type of suppression:
1. function-name-matches - allows users to disable `malloc`, `free`,
`pthread_mutex_lock` or similar. This could be helpful if a user thinks
these are real-time safe on their OS. Also allows disabling of any
function marked [[blocking]].
This is useful as a **more performant "early outs" compared to the
`call-stack-contains` suppression**. `call-stack-contains` is inherently
VERY costly, needing to inspect every frame of every stack for a
matching string. This new suppression has an early out before we unwind
the stack.
Added:
Modified:
compiler-rt/lib/rtsan/rtsan_assertions.h
compiler-rt/lib/rtsan/rtsan_checks.inc
compiler-rt/lib/rtsan/rtsan_suppressions.cpp
compiler-rt/lib/rtsan/rtsan_suppressions.h
compiler-rt/test/rtsan/stack_suppressions.cpp
compiler-rt/test/rtsan/stack_suppressions.cpp.supp
Removed:
################################################################################
diff --git a/compiler-rt/lib/rtsan/rtsan_assertions.h b/compiler-rt/lib/rtsan/rtsan_assertions.h
index 8183a8202478ff..927b32e03cf026 100644
--- a/compiler-rt/lib/rtsan/rtsan_assertions.h
+++ b/compiler-rt/lib/rtsan/rtsan_assertions.h
@@ -28,6 +28,9 @@ void ExpectNotRealtime(Context &context, const DiagnosticsInfo &info,
if (context.InRealtimeContext() && !context.IsBypassed()) {
ScopedBypass sb{context};
+ if (IsFunctionSuppressed(info.func_name))
+ return;
+
__sanitizer::BufferedStackTrace stack;
// We use the unwind_on_fatal flag here because of precedent with other
diff --git a/compiler-rt/lib/rtsan/rtsan_checks.inc b/compiler-rt/lib/rtsan/rtsan_checks.inc
index f5f23e044bd5d7..676b6a5791941e 100644
--- a/compiler-rt/lib/rtsan/rtsan_checks.inc
+++ b/compiler-rt/lib/rtsan/rtsan_checks.inc
@@ -17,3 +17,4 @@
// SummaryKind should be a string literal.
RTSAN_CHECK(CallStackContains, "call-stack-contains")
+RTSAN_CHECK(FunctionNameMatches, "function-name-matches")
diff --git a/compiler-rt/lib/rtsan/rtsan_suppressions.cpp b/compiler-rt/lib/rtsan/rtsan_suppressions.cpp
index c5051dd1910236..a7c3d42ac68af9 100644
--- a/compiler-rt/lib/rtsan/rtsan_suppressions.cpp
+++ b/compiler-rt/lib/rtsan/rtsan_suppressions.cpp
@@ -92,3 +92,16 @@ bool __rtsan::IsStackTraceSuppressed(const StackTrace &stack) {
}
return false;
}
+
+bool __rtsan::IsFunctionSuppressed(const char *function_name) {
+ if (suppression_ctx == nullptr)
+ return false;
+
+ const char *flag_name = ConvertTypeToFlagName(ErrorType::FunctionNameMatches);
+
+ if (!suppression_ctx->HasSuppressionType(flag_name))
+ return false;
+
+ Suppression *s;
+ return suppression_ctx->Match(function_name, flag_name, &s);
+}
diff --git a/compiler-rt/lib/rtsan/rtsan_suppressions.h b/compiler-rt/lib/rtsan/rtsan_suppressions.h
index 45545f8c0e0b65..9990b99f3b52cd 100644
--- a/compiler-rt/lib/rtsan/rtsan_suppressions.h
+++ b/compiler-rt/lib/rtsan/rtsan_suppressions.h
@@ -18,5 +18,6 @@ namespace __rtsan {
void InitializeSuppressions();
bool IsStackTraceSuppressed(const __sanitizer::StackTrace &stack);
+bool IsFunctionSuppressed(const char *function_name);
} // namespace __rtsan
diff --git a/compiler-rt/test/rtsan/stack_suppressions.cpp b/compiler-rt/test/rtsan/stack_suppressions.cpp
index 2aceedbb313b11..b9b2d0957636d9 100644
--- a/compiler-rt/test/rtsan/stack_suppressions.cpp
+++ b/compiler-rt/test/rtsan/stack_suppressions.cpp
@@ -1,4 +1,5 @@
// RUN: %clangxx -fsanitize=realtime %s -o %t
+// RUN: %env_rtsan_opts=halt_on_error=false %run %t 2>&1 | FileCheck %s --check-prefix=CHECK-NOSUPPRESSIONS
// RUN: %env_rtsan_opts=suppressions='%s.supp' not %run %t 2>&1 | FileCheck %s
// UNSUPPORTED: ios
@@ -8,8 +9,11 @@
#include <stdlib.h>
#include <unistd.h>
+#include <atomic>
#include <vector>
+std::atomic<int> cas_atomic{0};
+
void *MallocViolation() { return malloc(10); }
void VectorViolations() {
@@ -22,13 +26,18 @@ void VectorViolations() {
v.reserve(10);
}
-void BlockFunc() [[clang::blocking]] { usleep(1); }
+void BlockFunc() [[clang::blocking]] {
+ int expected = 0;
+ while (!cas_atomic.compare_exchange_weak(expected, 1)) {
+ expected = cas_atomic.load();
+ }
+}
void *process() [[clang::nonblocking]] {
- void *ptr = MallocViolation();
- VectorViolations();
- BlockFunc();
- free(ptr);
+ void *ptr = MallocViolation(); // Suppressed call-stack-contains
+ VectorViolations(); // Suppressed call-stack-contains with regex
+ BlockFunc(); // Suppressed function-name-matches
+ free(ptr); // Suppressed function-name-matches
// This is the one that should abort the program
// Everything else is suppressed
@@ -51,3 +60,9 @@ int main() {
// CHECK-NOT: vector
// CHECK-NOT: free
// CHECK-NOT: BlockFunc
+
+// CHECK-NOSUPPRESSIONS: malloc
+// CHECK-NOSUPPRESSIONS: vector
+// CHECK-NOSUPPRESSIONS: free
+// CHECK-NOSUPPRESSIONS: BlockFunc
+// CHECK-NOSUPPRESSIONS: usleep
diff --git a/compiler-rt/test/rtsan/stack_suppressions.cpp.supp b/compiler-rt/test/rtsan/stack_suppressions.cpp.supp
index bec4db259a3e0e..9aaa5a5f089091 100644
--- a/compiler-rt/test/rtsan/stack_suppressions.cpp.supp
+++ b/compiler-rt/test/rtsan/stack_suppressions.cpp.supp
@@ -1,4 +1,5 @@
call-stack-contains:MallocViolation
call-stack-contains:std::*vector
-call-stack-contains:free
-call-stack-contains:BlockFunc
+
+function-name-matches:free
+function-name-matches:Block*
More information about the llvm-commits
mailing list