From 9afa6f60cca3d1b23b62000cd7cf46de3957ad86 Mon Sep 17 00:00:00 2001 From: David Trevelyan Date: Mon, 20 Nov 2023 16:19:01 +0000 Subject: [PATCH] Make RADSan interceptors aware of OSX min versions --- compiler-rt/lib/radsan/CMakeLists.txt | 1 - compiler-rt/lib/radsan/radsan.cpp | 2 ++ compiler-rt/lib/radsan/radsan_interceptors.cpp | 3 +++ compiler-rt/lib/radsan/tests/CMakeLists.txt | 5 ----- compiler-rt/lib/radsan/tests/radsan_test.cpp | 2 ++ compiler-rt/lib/radsan/tests/radsan_test_interceptors.cpp | 2 ++ compiler-rt/lib/radsan/tests/radsan_test_utilities.h | 8 ++++---- 7 files changed, 13 insertions(+), 10 deletions(-) diff --git a/compiler-rt/lib/radsan/CMakeLists.txt b/compiler-rt/lib/radsan/CMakeLists.txt index c77971b00aa87..1cff9be14e272 100644 --- a/compiler-rt/lib/radsan/CMakeLists.txt +++ b/compiler-rt/lib/radsan/CMakeLists.txt @@ -27,7 +27,6 @@ set(RADSAN_LINK_LIBS ${COMPILER_RT_CXX_LINK_LIBS}) if(APPLE) - list(APPEND RADSAN_CFLAGS -mmacosx-version-min=10.15) add_compiler_rt_object_libraries(RTRadsan OS ${SANITIZER_COMMON_SUPPORTED_OS} ARCHS ${RADSAN_SUPPORTED_ARCH} diff --git a/compiler-rt/lib/radsan/radsan.cpp b/compiler-rt/lib/radsan/radsan.cpp index bd3295e547aa7..e53e3abc4a431 100644 --- a/compiler-rt/lib/radsan/radsan.cpp +++ b/compiler-rt/lib/radsan/radsan.cpp @@ -12,6 +12,7 @@ #include extern "C" { + RADSAN_EXPORT void radsan_init() { radsan::initialiseInterceptors(); } RADSAN_EXPORT void radsan_realtime_enter() { @@ -29,4 +30,5 @@ RADSAN_EXPORT void radsan_off() { RADSAN_EXPORT void radsan_on() { radsan::getContextForThisThread().bypassPop(); } + } diff --git a/compiler-rt/lib/radsan/radsan_interceptors.cpp b/compiler-rt/lib/radsan/radsan_interceptors.cpp index e44fbe46ca726..e7cfcf0ae4c92 100644 --- a/compiler-rt/lib/radsan/radsan_interceptors.cpp +++ b/compiler-rt/lib/radsan/radsan_interceptors.cpp @@ -18,6 +18,7 @@ #endif #if SANITIZER_APPLE +#include #include #include #endif @@ -261,10 +262,12 @@ INTERCEPTOR(void *, valloc, SIZE_T size) { return REAL(valloc)(size); } +#if (!SANITIZER_APPLE || __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_15) INTERCEPTOR(void *, aligned_alloc, SIZE_T alignment, SIZE_T size) { radsan::expectNotRealtime("aligned_alloc"); return REAL(aligned_alloc)(alignment, size); } +#endif INTERCEPTOR(int, posix_memalign, void **memptr, size_t alignment, size_t size) { radsan::expectNotRealtime("posix_memalign"); diff --git a/compiler-rt/lib/radsan/tests/CMakeLists.txt b/compiler-rt/lib/radsan/tests/CMakeLists.txt index 4da5255b53ccc..8a2ff563863a5 100644 --- a/compiler-rt/lib/radsan/tests/CMakeLists.txt +++ b/compiler-rt/lib/radsan/tests/CMakeLists.txt @@ -41,12 +41,7 @@ if (APPLE) list(APPEND RADSAN_UNITTEST_LINK_FLAGS ${WEAK_SYMBOL_LINK_FLAGS}) list(APPEND RADSAN_UNITTEST_LINK_FLAGS ${DARWIN_osx_LINK_FLAGS}) list(APPEND RADSAN_UNITTEST_CFLAGS ${DARWIN_osx_CFLAGS}) - # aligned_alloc is only available in macOS 10.15 and later. This is a temporary - # solution that we're running with until we have a full understanding of what - # macOS versions we wish to support. - list(APPEND RADSAN_UNITTEST_CFLAGS -mmacosx-version-min=10.15) else() - #append_list_if(COMPILER_RT_HAS_LIBATOMIC -latomic RADSAN_UNITTEST_LINK_FLAGS) list(APPEND RADSAN_UNITTEST_LINK_FLAGS -latomic) endif() diff --git a/compiler-rt/lib/radsan/tests/radsan_test.cpp b/compiler-rt/lib/radsan/tests/radsan_test.cpp index 7d3e0c5540ff0..ee48553ba8584 100644 --- a/compiler-rt/lib/radsan/tests/radsan_test.cpp +++ b/compiler-rt/lib/radsan/tests/radsan_test.cpp @@ -98,6 +98,7 @@ TEST(TestRadsan, unlockingAMutexDiesWhenRealtime) { expectNonrealtimeSurvival(func); } +#if (!SANITIZER_APPLE || __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_12) TEST(TestRadsan, lockingASharedMutexDiesWhenRealtime) { auto mutex = std::shared_mutex(); auto func = [&]() { mutex.lock(); }; @@ -127,6 +128,7 @@ TEST(TestRadsan, sharedUnlockingASharedMutexDiesWhenRealtime) { expectRealtimeDeath(func); expectNonrealtimeSurvival(func); } +#endif TEST(TestRadsan, launchingAThreadDiesWhenRealtime) { auto func = [&]() { diff --git a/compiler-rt/lib/radsan/tests/radsan_test_interceptors.cpp b/compiler-rt/lib/radsan/tests/radsan_test_interceptors.cpp index b7d8286cfb4c9..f0a96060edb5b 100644 --- a/compiler-rt/lib/radsan/tests/radsan_test_interceptors.cpp +++ b/compiler-rt/lib/radsan/tests/radsan_test_interceptors.cpp @@ -66,11 +66,13 @@ TEST(TestRadsanInterceptors, vallocDiesWhenRealtime) { expectNonrealtimeSurvival(func); } +#if (!SANITIZER_APPLE || __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_15) TEST(TestRadsanInterceptors, alignedAllocDiesWhenRealtime) { auto func = []() { EXPECT_NE(nullptr, aligned_alloc(16, 32)); }; expectRealtimeDeath(func, "aligned_alloc"); expectNonrealtimeSurvival(func); } +#endif // free_sized and free_aligned_sized (both C23) are not yet supported TEST(TestRadsanInterceptors, freeDiesWhenRealtime) { diff --git a/compiler-rt/lib/radsan/tests/radsan_test_utilities.h b/compiler-rt/lib/radsan/tests/radsan_test_utilities.h index d7db09816b2e7..46515a00cab3d 100644 --- a/compiler-rt/lib/radsan/tests/radsan_test_utilities.h +++ b/compiler-rt/lib/radsan/tests/radsan_test_utilities.h @@ -20,16 +20,16 @@ template } template -void expectRealtimeDeath( - Function &&func, std::optional intercepted_method_name = {}) { +void expectRealtimeDeath(Function &&func, + std::string intercepted_method_name = {}) { using namespace testing; auto expected_error_substr = [&]() -> std::string { - return intercepted_method_name.has_value() + return !intercepted_method_name.empty() ? "Real-time violation: intercepted call to real-time unsafe " "function `" + - intercepted_method_name.value() + "`" + intercepted_method_name + "`" : ""; };