https://github.com/cjappl updated https://github.com/llvm/llvm-project/pull/106736
>From c9d3d6c256b763bc99e7bf2d2dca43cb1e88adb8 Mon Sep 17 00:00:00 2001 From: Chris Apple <cja-priv...@pm.me> Date: Thu, 29 Aug 2024 17:16:37 -0700 Subject: [PATCH 1/6] [clang][rtsan] Add realtime sanitizer to Features.def --- clang/include/clang/Basic/Features.def | 2 ++ clang/test/Lexer/has_feature_realtime_sanitizer.cpp | 12 ++++++++++++ 2 files changed, 14 insertions(+) create mode 100644 clang/test/Lexer/has_feature_realtime_sanitizer.cpp diff --git a/clang/include/clang/Basic/Features.def b/clang/include/clang/Basic/Features.def index 10538f555b418e..7f5d26118bdc71 100644 --- a/clang/include/clang/Basic/Features.def +++ b/clang/include/clang/Basic/Features.def @@ -54,6 +54,8 @@ FEATURE(memtag_globals, FEATURE(xray_instrument, LangOpts.XRayInstrument) FEATURE(undefined_behavior_sanitizer, LangOpts.Sanitize.hasOneOf(SanitizerKind::Undefined)) +FEATURE(realtime_sanitizer, + LangOpts.Sanitize.has(SanitizerKind::Realtime)) FEATURE(coverage_sanitizer, LangOpts.SanitizeCoverage) FEATURE(assume_nonnull, true) FEATURE(attribute_analyzer_noreturn, true) diff --git a/clang/test/Lexer/has_feature_realtime_sanitizer.cpp b/clang/test/Lexer/has_feature_realtime_sanitizer.cpp new file mode 100644 index 00000000000000..76febeb6473a4b --- /dev/null +++ b/clang/test/Lexer/has_feature_realtime_sanitizer.cpp @@ -0,0 +1,12 @@ +// RUN: %clang_cc1 -E -fsanitize=realtime %s -o - | FileCheck --check-prefix=CHECK-RTSAN %s +// RUN: %clang_cc1 -E %s -o - | FileCheck --check-prefix=CHECK-NO-RTSAN %s + +#if __has_feature(realtime_sanitizer) +int RealtimeSanitizerEnabled(); +#else +int RealtimeSanitizerDisabled(); +#endif + +// CHECK-RTSAN: RealtimeSanitizerEnabled + +// CHECK-NO-RTSAN: RealtimeSanitizerDisabled >From 3d1598edfde8b349bb65d9f132fdfdae988a4aa5 Mon Sep 17 00:00:00 2001 From: Chris Apple <cja-priv...@pm.me> Date: Thu, 29 Aug 2024 17:17:12 -0700 Subject: [PATCH 2/6] [compiler-rt][rtsan] Introduce rtsan_interface.h and ScopedDisabler --- compiler-rt/include/CMakeLists.txt | 1 + .../include/sanitizer/rtsan_interface.h | 115 ++++++++++++++++++ compiler-rt/lib/rtsan/rtsan.h | 20 +-- compiler-rt/test/rtsan/disabler.cpp | 35 ++++++ compiler-rt/test/rtsan/enabler.cpp | 35 ++++++ 5 files changed, 192 insertions(+), 14 deletions(-) create mode 100644 compiler-rt/include/sanitizer/rtsan_interface.h create mode 100644 compiler-rt/test/rtsan/disabler.cpp create mode 100644 compiler-rt/test/rtsan/enabler.cpp diff --git a/compiler-rt/include/CMakeLists.txt b/compiler-rt/include/CMakeLists.txt index d598a94ee2e237..242d62b9b447b1 100644 --- a/compiler-rt/include/CMakeLists.txt +++ b/compiler-rt/include/CMakeLists.txt @@ -10,6 +10,7 @@ if (COMPILER_RT_BUILD_SANITIZERS) sanitizer/lsan_interface.h sanitizer/msan_interface.h sanitizer/netbsd_syscall_hooks.h + sanitizer/rtsan_interface.h sanitizer/scudo_interface.h sanitizer/tsan_interface.h sanitizer/tsan_interface_atomic.h diff --git a/compiler-rt/include/sanitizer/rtsan_interface.h b/compiler-rt/include/sanitizer/rtsan_interface.h new file mode 100644 index 00000000000000..399cbfd294dacd --- /dev/null +++ b/compiler-rt/include/sanitizer/rtsan_interface.h @@ -0,0 +1,115 @@ +//===-- sanitizer/rtsan_interface.h -----------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// This file is a part of RealtimeSanitizer. +// +// Public interface header. +//===----------------------------------------------------------------------===// + +#ifndef SANITIZER_RTSAN_INTERFACE_H +#define SANITIZER_RTSAN_INTERFACE_H + +#if __has_include(<sanitizer/common_interface_defs.h>) +#include <sanitizer/common_interface_defs.h> +#else +#define SANITIZER_CDECL +#endif // __has_include(<sanitizer/common_interface_defs.h>) + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +// Initializes rtsan if it has not been initialized yet. +// Used by the RTSan runtime to ensure that rtsan is initialized before any +// other rtsan functions are called. +void SANITIZER_CDECL __rtsan_ensure_initialized(); + +// Enter real-time context. +// When in a real-time context, RTSan interceptors will error if realtime +// violations are detected. Calls to this method are injected at the code +// generation stage when RTSan is enabled. +void SANITIZER_CDECL __rtsan_realtime_enter(); + +// Exit the real-time context. +// When not in a real-time context, RTSan interceptors will simply forward +// intercepted method calls to the real methods. +void SANITIZER_CDECL __rtsan_realtime_exit(); + +// Disable all RTSan error reporting. +void SANITIZER_CDECL __rtsan_disable(void); + +// Re-enable all RTSan error reporting. +// The counterpart to `__rtsan_disable`. +void SANITIZER_CDECL __rtsan_enable(void); + +// Expect that the next call to a function with the given name will not be +// called from a realtime context. +void SANITIZER_CDECL +__rtsan_expect_not_realtime(const char *intercepted_function_name); + +#ifdef __cplusplus +} // extern "C" + +namespace __rtsan { +#if defined(__has_feature) && __has_feature(realtime_sanitizer) + +void Initialize() { __rtsan_ensure_initialized(); } + +class ScopedEnabler { +public: + ScopedEnabler() { __rtsan_realtime_enter(); } + ~ScopedEnabler() { __rtsan_realtime_exit(); } + +#if __cplusplus >= 201103L + ScopedEnabler(const ScopedEnabler &) = delete; + ScopedEnabler &operator=(const ScopedEnabler &) = delete; + ScopedEnabler(ScopedEnabler &&) = delete; + ScopedEnabler &operator=(ScopedEnabler &&) = delete; +#else +private: + ScopedEnabler(const ScopedEnabler &); + ScopedEnabler &operator=(const ScopedEnabler &); +#endif // __cplusplus >= 201103L +}; + +class ScopedDisabler { +public: + ScopedDisabler() { __rtsan_disable(); } + ~ScopedDisabler() { __rtsan_enable(); } + +#if __cplusplus >= 201103L + ScopedDisabler(const ScopedDisabler &) = delete; + ScopedDisabler &operator=(const ScopedDisabler &) = delete; + ScopedDisabler(ScopedDisabler &&) = delete; + ScopedDisabler &operator=(ScopedDisabler &&) = delete; +#else +private: + ScopedDisabler(const ScopedDisabler &); + ScopedDisabler &operator=(const ScopedDisabler &); +#endif // __cplusplus >= 201103L +}; + +#else // doesn't have realtime_sanitizer + +void Initialize() {} + +class ScopedEnabler { +public: + ScopedEnabler() {} +}; + +class ScopedDisabler { +public: + ScopedDisabler() {} +}; + +#endif // defined(__has_feature) && __has_feature(realtime_sanitizer) +} // namespace __rtsan +#endif // __cplusplus + +#endif // SANITIZER_RTSAN_INTERFACE_H diff --git a/compiler-rt/lib/rtsan/rtsan.h b/compiler-rt/lib/rtsan/rtsan.h index ae23609f97d2dc..80fcb1dec2ff1c 100644 --- a/compiler-rt/lib/rtsan/rtsan.h +++ b/compiler-rt/lib/rtsan/rtsan.h @@ -18,32 +18,24 @@ extern "C" { // A call to this method is added to the preinit array on Linux systems. SANITIZER_INTERFACE_ATTRIBUTE void __rtsan_init(); -// Initializes rtsan if it has not been initialized yet. -// Used by the RTSan runtime to ensure that rtsan is initialized before any -// other rtsan functions are called. +// See documentation in rtsan_interface.h. SANITIZER_INTERFACE_ATTRIBUTE void __rtsan_ensure_initialized(); SANITIZER_INTERFACE_ATTRIBUTE bool __rtsan_is_initialized(); -// Enter real-time context. -// When in a real-time context, RTSan interceptors will error if realtime -// violations are detected. Calls to this method are injected at the code -// generation stage when RTSan is enabled. +// See documentation in rtsan_interface.h. SANITIZER_INTERFACE_ATTRIBUTE void __rtsan_realtime_enter(); -// Exit the real-time context. -// When not in a real-time context, RTSan interceptors will simply forward -// intercepted method calls to the real methods. +// See documentation in rtsan_interface.h. SANITIZER_INTERFACE_ATTRIBUTE void __rtsan_realtime_exit(); -// Disable all RTSan error reporting. -// Injected into the code if "nosanitize(realtime)" is on a function. +// See documentation in rtsan_interface.h. SANITIZER_INTERFACE_ATTRIBUTE void __rtsan_disable(); -// Re-enable all RTSan error reporting. -// The counterpart to `__rtsan_disable`. +// See documentation in rtsan_interface.h. SANITIZER_INTERFACE_ATTRIBUTE void __rtsan_enable(); +// See documentation in rtsan_interface.h. SANITIZER_INTERFACE_ATTRIBUTE void __rtsan_expect_not_realtime(const char *intercepted_function_name); diff --git a/compiler-rt/test/rtsan/disabler.cpp b/compiler-rt/test/rtsan/disabler.cpp new file mode 100644 index 00000000000000..1fc14b0bac4e01 --- /dev/null +++ b/compiler-rt/test/rtsan/disabler.cpp @@ -0,0 +1,35 @@ +// RUN: %clangxx -fsanitize=realtime %s -o %t +// RUN: not %run %t 2>&1 | FileCheck %s +// RUN: %clangxx %s -fsanitize=realtime -o - -S -emit-llvm | FileCheck %s --check-prefix=CHECK-ENABLED-IR +// RUN: %clangxx %s -o - -S -emit-llvm | FileCheck %s --check-prefix=CHECK-DISABLED-IR +// UNSUPPORTED: ios + +#include <stdio.h> +#include <stdlib.h> + +#include "sanitizer/rtsan_interface.h" + +void violation() [[clang::nonblocking]] { + void *ptr; + { + __rtsan::ScopedDisabler disabler{}; + ptr = malloc(2); + printf("ptr: %p\n", ptr); // ensure we don't optimize out the malloc + } + + free(ptr); +} + +int main() { + violation(); + return 0; + // CHECK: {{.*Real-time violation.*}} + // CHECK-NOT: {{.*malloc*}} + // CHECK: {{.*free*}} +} + +// CHECK-ENABLED-IR: {{.*@__rtsan_disable.*}} +// CHECK-ENABLED-IR: {{.*@__rtsan_enable.*}} + +// CHECK-DISABLED-IR-NOT: {{.*__rtsan_disable.*}} +// CHECK-DISABLED-IR-NOT: {{.*__rtsan_enable.*}} diff --git a/compiler-rt/test/rtsan/enabler.cpp b/compiler-rt/test/rtsan/enabler.cpp new file mode 100644 index 00000000000000..0ae8ba6e792839 --- /dev/null +++ b/compiler-rt/test/rtsan/enabler.cpp @@ -0,0 +1,35 @@ +// RUN: %clangxx -fsanitize=realtime %s -o %t +// RUN: not %run %t 2>&1 | FileCheck %s +// RUN: %clangxx %s -fsanitize=realtime -o - -S -emit-llvm | FileCheck %s --check-prefix=CHECK-ENABLED-IR +// RUN: %clangxx %s -o - -S -emit-llvm | FileCheck %s --check-prefix=CHECK-DISABLED-IR +// UNSUPPORTED: ios + +#include <stdio.h> +#include <stdlib.h> + +#include "sanitizer/rtsan_interface.h" + +void violation() { + void *ptr = malloc(2); + ptr = malloc(2); + printf("ptr: %p\n", ptr); // ensure we don't optimize out the malloc + + { + __rtsan::ScopedEnabler rtsan{}; + free(ptr); + } +} + +int main() { + violation(); + return 0; + // CHECK: {{.*Real-time violation.*}} + // CHECK-NOT: {{.*malloc*}} + // CHECK: {{.*free*}} +} + +// CHECK-ENABLED-IR: {{.*@__rtsan_realtime_enter.*}} +// CHECK-ENABLED-IR: {{.*@__rtsan_realtime_exit.*}} + +// CHECK-DISABLED-IR-NOT: {{.*__rtsan_realtime_enter.*}} +// CHECK-DISABLED-IR-NOT: {{.*__rtsan_realtime_exit.*}} >From 62aee5adb5739a34d7c5ef0b37488b41eca06e3d Mon Sep 17 00:00:00 2001 From: Chris Apple <cja-priv...@pm.me> Date: Fri, 30 Aug 2024 08:20:03 -0700 Subject: [PATCH 3/6] Add rtsan_enabled define --- compiler-rt/include/sanitizer/rtsan_interface.h | 6 ++++-- compiler-rt/test/rtsan/enabler.cpp | 7 +++++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/compiler-rt/include/sanitizer/rtsan_interface.h b/compiler-rt/include/sanitizer/rtsan_interface.h index 399cbfd294dacd..b816d5a8b419ee 100644 --- a/compiler-rt/include/sanitizer/rtsan_interface.h +++ b/compiler-rt/include/sanitizer/rtsan_interface.h @@ -56,7 +56,8 @@ __rtsan_expect_not_realtime(const char *intercepted_function_name); } // extern "C" namespace __rtsan { -#if defined(__has_feature) && __has_feature(realtime_sanitizer) +#if (defined(__has_feature) && __has_feature(realtime_sanitizer)) || \ + defined(RTSAN_ENABLED) void Initialize() { __rtsan_ensure_initialized(); } @@ -108,7 +109,8 @@ class ScopedDisabler { ScopedDisabler() {} }; -#endif // defined(__has_feature) && __has_feature(realtime_sanitizer) +#endif // defined(__has_feature) && __has_feature(realtime_sanitizer) || + // defined(RTSAN_ENABLED) } // namespace __rtsan #endif // __cplusplus diff --git a/compiler-rt/test/rtsan/enabler.cpp b/compiler-rt/test/rtsan/enabler.cpp index 0ae8ba6e792839..f26116ba274e5f 100644 --- a/compiler-rt/test/rtsan/enabler.cpp +++ b/compiler-rt/test/rtsan/enabler.cpp @@ -1,6 +1,6 @@ -// RUN: %clangxx -fsanitize=realtime %s -o %t +// RUN: %clangxx -DRTSAN_ENABLED -fsanitize=realtime %s -o %t // RUN: not %run %t 2>&1 | FileCheck %s -// RUN: %clangxx %s -fsanitize=realtime -o - -S -emit-llvm | FileCheck %s --check-prefix=CHECK-ENABLED-IR +// RUN: %clangxx %s -DRTSAN_ENABLED -o - -S -emit-llvm | FileCheck %s --check-prefix=CHECK-ENABLED-IR // RUN: %clangxx %s -o - -S -emit-llvm | FileCheck %s --check-prefix=CHECK-DISABLED-IR // UNSUPPORTED: ios @@ -21,6 +21,7 @@ void violation() { } int main() { + __rtsan::Initialize(); violation(); return 0; // CHECK: {{.*Real-time violation.*}} @@ -28,8 +29,10 @@ int main() { // CHECK: {{.*free*}} } +// CHECK-ENABLED-IR: {{.*__rtsan_ensure_initialized.*}} // CHECK-ENABLED-IR: {{.*@__rtsan_realtime_enter.*}} // CHECK-ENABLED-IR: {{.*@__rtsan_realtime_exit.*}} +// CHECK-DISABLED-IR-NOT: {{.*__rtsan_ensure_initialized.*}} // CHECK-DISABLED-IR-NOT: {{.*__rtsan_realtime_enter.*}} // CHECK-DISABLED-IR-NOT: {{.*__rtsan_realtime_exit.*}} >From d769c64951dfe972eb78bf128854e2ae1379284c Mon Sep 17 00:00:00 2001 From: Chris Apple <cja-priv...@pm.me> Date: Fri, 30 Aug 2024 08:33:57 -0700 Subject: [PATCH 4/6] Tweaked name of macro --- compiler-rt/include/sanitizer/rtsan_interface.h | 6 +++--- compiler-rt/test/rtsan/enabler.cpp | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/compiler-rt/include/sanitizer/rtsan_interface.h b/compiler-rt/include/sanitizer/rtsan_interface.h index b816d5a8b419ee..a32ba94aad453c 100644 --- a/compiler-rt/include/sanitizer/rtsan_interface.h +++ b/compiler-rt/include/sanitizer/rtsan_interface.h @@ -57,7 +57,7 @@ __rtsan_expect_not_realtime(const char *intercepted_function_name); namespace __rtsan { #if (defined(__has_feature) && __has_feature(realtime_sanitizer)) || \ - defined(RTSAN_ENABLED) + SANITIZE_REALTIME void Initialize() { __rtsan_ensure_initialized(); } @@ -109,8 +109,8 @@ class ScopedDisabler { ScopedDisabler() {} }; -#endif // defined(__has_feature) && __has_feature(realtime_sanitizer) || - // defined(RTSAN_ENABLED) +#endif // (defined(__has_feature) && __has_feature(realtime_sanitizer)) || + // SANITIZE_REALTIME } // namespace __rtsan #endif // __cplusplus diff --git a/compiler-rt/test/rtsan/enabler.cpp b/compiler-rt/test/rtsan/enabler.cpp index f26116ba274e5f..68f37276ed2462 100644 --- a/compiler-rt/test/rtsan/enabler.cpp +++ b/compiler-rt/test/rtsan/enabler.cpp @@ -1,6 +1,6 @@ -// RUN: %clangxx -DRTSAN_ENABLED -fsanitize=realtime %s -o %t +// RUN: %clangxx -DSANITIZE_REALTIME=1 -fsanitize=realtime %s -o %t // RUN: not %run %t 2>&1 | FileCheck %s -// RUN: %clangxx %s -DRTSAN_ENABLED -o - -S -emit-llvm | FileCheck %s --check-prefix=CHECK-ENABLED-IR +// RUN: %clangxx %s -DSANITIZE_REALTIME=1 -o - -S -emit-llvm | FileCheck %s --check-prefix=CHECK-ENABLED-IR // RUN: %clangxx %s -o - -S -emit-llvm | FileCheck %s --check-prefix=CHECK-DISABLED-IR // UNSUPPORTED: ios >From b8e18b63014716eebea5e16d1893ebf42ccc4ff8 Mon Sep 17 00:00:00 2001 From: Chris Apple <cja-priv...@pm.me> Date: Mon, 2 Sep 2024 08:50:34 -0700 Subject: [PATCH 5/6] [PR] david - get rid of scoped enabler, macro, simplify interface --- .../include/sanitizer/rtsan_interface.h | 53 +------------------ compiler-rt/lib/rtsan/rtsan.h | 16 ++++-- compiler-rt/test/rtsan/enabler.cpp | 38 ------------- 3 files changed, 14 insertions(+), 93 deletions(-) delete mode 100644 compiler-rt/test/rtsan/enabler.cpp diff --git a/compiler-rt/include/sanitizer/rtsan_interface.h b/compiler-rt/include/sanitizer/rtsan_interface.h index a32ba94aad453c..875e76b66eac3d 100644 --- a/compiler-rt/include/sanitizer/rtsan_interface.h +++ b/compiler-rt/include/sanitizer/rtsan_interface.h @@ -24,22 +24,6 @@ extern "C" { #endif // __cplusplus -// Initializes rtsan if it has not been initialized yet. -// Used by the RTSan runtime to ensure that rtsan is initialized before any -// other rtsan functions are called. -void SANITIZER_CDECL __rtsan_ensure_initialized(); - -// Enter real-time context. -// When in a real-time context, RTSan interceptors will error if realtime -// violations are detected. Calls to this method are injected at the code -// generation stage when RTSan is enabled. -void SANITIZER_CDECL __rtsan_realtime_enter(); - -// Exit the real-time context. -// When not in a real-time context, RTSan interceptors will simply forward -// intercepted method calls to the real methods. -void SANITIZER_CDECL __rtsan_realtime_exit(); - // Disable all RTSan error reporting. void SANITIZER_CDECL __rtsan_disable(void); @@ -47,36 +31,11 @@ void SANITIZER_CDECL __rtsan_disable(void); // The counterpart to `__rtsan_disable`. void SANITIZER_CDECL __rtsan_enable(void); -// Expect that the next call to a function with the given name will not be -// called from a realtime context. -void SANITIZER_CDECL -__rtsan_expect_not_realtime(const char *intercepted_function_name); - #ifdef __cplusplus } // extern "C" namespace __rtsan { -#if (defined(__has_feature) && __has_feature(realtime_sanitizer)) || \ - SANITIZE_REALTIME - -void Initialize() { __rtsan_ensure_initialized(); } - -class ScopedEnabler { -public: - ScopedEnabler() { __rtsan_realtime_enter(); } - ~ScopedEnabler() { __rtsan_realtime_exit(); } - -#if __cplusplus >= 201103L - ScopedEnabler(const ScopedEnabler &) = delete; - ScopedEnabler &operator=(const ScopedEnabler &) = delete; - ScopedEnabler(ScopedEnabler &&) = delete; - ScopedEnabler &operator=(ScopedEnabler &&) = delete; -#else -private: - ScopedEnabler(const ScopedEnabler &); - ScopedEnabler &operator=(const ScopedEnabler &); -#endif // __cplusplus >= 201103L -}; +#if defined(__has_feature) && __has_feature(realtime_sanitizer) class ScopedDisabler { public: @@ -97,20 +56,12 @@ class ScopedDisabler { #else // doesn't have realtime_sanitizer -void Initialize() {} - -class ScopedEnabler { -public: - ScopedEnabler() {} -}; - class ScopedDisabler { public: ScopedDisabler() {} }; -#endif // (defined(__has_feature) && __has_feature(realtime_sanitizer)) || - // SANITIZE_REALTIME +#endif // defined(__has_feature) && __has_feature(realtime_sanitizer) } // namespace __rtsan #endif // __cplusplus diff --git a/compiler-rt/lib/rtsan/rtsan.h b/compiler-rt/lib/rtsan/rtsan.h index 80fcb1dec2ff1c..68f875164af8f6 100644 --- a/compiler-rt/lib/rtsan/rtsan.h +++ b/compiler-rt/lib/rtsan/rtsan.h @@ -18,15 +18,22 @@ extern "C" { // A call to this method is added to the preinit array on Linux systems. SANITIZER_INTERFACE_ATTRIBUTE void __rtsan_init(); -// See documentation in rtsan_interface.h. +// Initializes rtsan if it has not been initialized yet. +// Used by the RTSan runtime to ensure that rtsan is initialized before any +// other rtsan functions are called. SANITIZER_INTERFACE_ATTRIBUTE void __rtsan_ensure_initialized(); SANITIZER_INTERFACE_ATTRIBUTE bool __rtsan_is_initialized(); -// See documentation in rtsan_interface.h. +// Enter real-time context. +// When in a real-time context, RTSan interceptors will error if realtime +// violations are detected. Calls to this method are injected at the code +// generation stage when RTSan is enabled. SANITIZER_INTERFACE_ATTRIBUTE void __rtsan_realtime_enter(); -// See documentation in rtsan_interface.h. +// Exit the real-time context. +// When not in a real-time context, RTSan interceptors will simply forward +// intercepted method calls to the real methods. SANITIZER_INTERFACE_ATTRIBUTE void __rtsan_realtime_exit(); // See documentation in rtsan_interface.h. @@ -35,7 +42,8 @@ SANITIZER_INTERFACE_ATTRIBUTE void __rtsan_disable(); // See documentation in rtsan_interface.h. SANITIZER_INTERFACE_ATTRIBUTE void __rtsan_enable(); -// See documentation in rtsan_interface.h. +// Expect that the next call to a function with the given name will not be +// called from a realtime context. SANITIZER_INTERFACE_ATTRIBUTE void __rtsan_expect_not_realtime(const char *intercepted_function_name); diff --git a/compiler-rt/test/rtsan/enabler.cpp b/compiler-rt/test/rtsan/enabler.cpp deleted file mode 100644 index 68f37276ed2462..00000000000000 --- a/compiler-rt/test/rtsan/enabler.cpp +++ /dev/null @@ -1,38 +0,0 @@ -// RUN: %clangxx -DSANITIZE_REALTIME=1 -fsanitize=realtime %s -o %t -// RUN: not %run %t 2>&1 | FileCheck %s -// RUN: %clangxx %s -DSANITIZE_REALTIME=1 -o - -S -emit-llvm | FileCheck %s --check-prefix=CHECK-ENABLED-IR -// RUN: %clangxx %s -o - -S -emit-llvm | FileCheck %s --check-prefix=CHECK-DISABLED-IR -// UNSUPPORTED: ios - -#include <stdio.h> -#include <stdlib.h> - -#include "sanitizer/rtsan_interface.h" - -void violation() { - void *ptr = malloc(2); - ptr = malloc(2); - printf("ptr: %p\n", ptr); // ensure we don't optimize out the malloc - - { - __rtsan::ScopedEnabler rtsan{}; - free(ptr); - } -} - -int main() { - __rtsan::Initialize(); - violation(); - return 0; - // CHECK: {{.*Real-time violation.*}} - // CHECK-NOT: {{.*malloc*}} - // CHECK: {{.*free*}} -} - -// CHECK-ENABLED-IR: {{.*__rtsan_ensure_initialized.*}} -// CHECK-ENABLED-IR: {{.*@__rtsan_realtime_enter.*}} -// CHECK-ENABLED-IR: {{.*@__rtsan_realtime_exit.*}} - -// CHECK-DISABLED-IR-NOT: {{.*__rtsan_ensure_initialized.*}} -// CHECK-DISABLED-IR-NOT: {{.*__rtsan_realtime_enter.*}} -// CHECK-DISABLED-IR-NOT: {{.*__rtsan_realtime_exit.*}} >From 78758966c3094d14ff032c65c7410bd25d11082f Mon Sep 17 00:00:00 2001 From: Chris Apple <cja-priv...@pm.me> Date: Mon, 2 Sep 2024 08:51:28 -0700 Subject: [PATCH 6/6] Improve docs of rtsan enable/disable --- compiler-rt/include/sanitizer/rtsan_interface.h | 5 +++-- compiler-rt/lib/rtsan/rtsan.h | 2 -- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/compiler-rt/include/sanitizer/rtsan_interface.h b/compiler-rt/include/sanitizer/rtsan_interface.h index 875e76b66eac3d..edff161d74b4e5 100644 --- a/compiler-rt/include/sanitizer/rtsan_interface.h +++ b/compiler-rt/include/sanitizer/rtsan_interface.h @@ -25,10 +25,11 @@ extern "C" { #endif // __cplusplus // Disable all RTSan error reporting. +// Must be paired with a call to `__rtsan_enable` void SANITIZER_CDECL __rtsan_disable(void); // Re-enable all RTSan error reporting. -// The counterpart to `__rtsan_disable`. +// Must follow a call to `__rtsan_disable`. void SANITIZER_CDECL __rtsan_enable(void); #ifdef __cplusplus @@ -54,7 +55,7 @@ class ScopedDisabler { #endif // __cplusplus >= 201103L }; -#else // doesn't have realtime_sanitizer +#else class ScopedDisabler { public: diff --git a/compiler-rt/lib/rtsan/rtsan.h b/compiler-rt/lib/rtsan/rtsan.h index 68f875164af8f6..ca72d41d11125c 100644 --- a/compiler-rt/lib/rtsan/rtsan.h +++ b/compiler-rt/lib/rtsan/rtsan.h @@ -42,8 +42,6 @@ SANITIZER_INTERFACE_ATTRIBUTE void __rtsan_disable(); // See documentation in rtsan_interface.h. SANITIZER_INTERFACE_ATTRIBUTE void __rtsan_enable(); -// Expect that the next call to a function with the given name will not be -// called from a realtime context. SANITIZER_INTERFACE_ATTRIBUTE void __rtsan_expect_not_realtime(const char *intercepted_function_name); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits