diff --git a/compiler-rt/lib/rtsan/rtsan_interceptors_posix.cpp b/compiler-rt/lib/rtsan/rtsan_interceptors_posix.cpp index 890d6c11c4076..1e0938efed065 100644 --- a/compiler-rt/lib/rtsan/rtsan_interceptors_posix.cpp +++ b/compiler-rt/lib/rtsan/rtsan_interceptors_posix.cpp @@ -464,10 +464,19 @@ INTERCEPTOR(void *, valloc, SIZE_T size) { } #if SANITIZER_INTERCEPT_ALIGNED_ALLOC + +// In some cases, when targeting older Darwin versions, this warning may pop up. +// Because we are providing a wrapper, the client is responsible to check +// whether aligned_alloc is available, not us. We still succeed linking on an +// old OS, because we are using a weak symbol (see aligned_alloc in +// sanitizer_platform_interceptors.h) +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wunguarded-availability-new" INTERCEPTOR(void *, aligned_alloc, SIZE_T alignment, SIZE_T size) { __rtsan_notify_intercepted_call("aligned_alloc"); return REAL(aligned_alloc)(alignment, size); } +#pragma clang diagnostic pop #define RTSAN_MAYBE_INTERCEPT_ALIGNED_ALLOC INTERCEPT_FUNCTION(aligned_alloc) #else #define RTSAN_MAYBE_INTERCEPT_ALIGNED_ALLOC diff --git a/compiler-rt/lib/rtsan/tests/rtsan_test_interceptors_posix.cpp b/compiler-rt/lib/rtsan/tests/rtsan_test_interceptors_posix.cpp index 6233c3e91800e..38274485c29f6 100644 --- a/compiler-rt/lib/rtsan/tests/rtsan_test_interceptors_posix.cpp +++ b/compiler-rt/lib/rtsan/tests/rtsan_test_interceptors_posix.cpp @@ -122,13 +122,20 @@ TEST(TestRtsanInterceptors, VallocDiesWhenRealtime) { ExpectNonRealtimeSurvival(Func); } -#if SANITIZER_INTERCEPT_ALIGNED_ALLOC +#if __has_builtin(__builtin_available) && SANITIZER_APPLE +#define ALIGNED_ALLOC_AVAILABLE() (__builtin_available(macOS 10.15, *)) +#else +// We are going to assume this is true until we hit systems where it isn't +#define ALIGNED_ALLOC_AVAILABLE() (true) +#endif + TEST(TestRtsanInterceptors, AlignedAllocDiesWhenRealtime) { - auto Func = []() { EXPECT_NE(nullptr, aligned_alloc(16, 32)); }; - ExpectRealtimeDeath(Func, "aligned_alloc"); - ExpectNonRealtimeSurvival(Func); + if (ALIGNED_ALLOC_AVAILABLE()) { + 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(TestRtsanInterceptors, FreeDiesWhenRealtime) { diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_platform_interceptors.h b/compiler-rt/lib/sanitizer_common/sanitizer_platform_interceptors.h index 6959a6d52d604..3fd6b595ef197 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_platform_interceptors.h +++ b/compiler-rt/lib/sanitizer_common/sanitizer_platform_interceptors.h @@ -84,6 +84,25 @@ #define SI_NOT_MAC 1 #endif +#if SANITIZER_APPLE +# include + +// aligned_alloc was introduced in OSX 10.15 +// Linking will fail when using an older SDK +# if defined(__MAC_10_15) +// macOS 10.15 is greater than our minimal deployment target. To ensure we +// generate a weak reference so the dylib continues to work on older +// systems, we need to forward declare the intercepted function as "weak +// imports". +SANITIZER_WEAK_IMPORT void *aligned_alloc(__sanitizer::usize __alignment, + __sanitizer::usize __size); +# define SI_MAC_SDK_10_15_AVAILABLE 1 +# else +# define SI_MAC_SDK_10_15_AVAILABLE 0 +# endif // defined(__MAC_10_15) + +#endif // SANITIZER_APPLE + #if SANITIZER_IOS #define SI_IOS 1 #else @@ -500,7 +519,8 @@ #define SANITIZER_INTERCEPT_PVALLOC (SI_GLIBC || SI_ANDROID) #define SANITIZER_INTERCEPT_CFREE (SI_GLIBC && !SANITIZER_RISCV64) #define SANITIZER_INTERCEPT_REALLOCARRAY SI_POSIX -#define SANITIZER_INTERCEPT_ALIGNED_ALLOC (!SI_MAC) +#define SANITIZER_INTERCEPT_ALIGNED_ALLOC \ + (!SI_MAC || SI_MAC_SDK_10_15_AVAILABLE) #define SANITIZER_INTERCEPT_MALLOC_USABLE_SIZE (!SI_MAC && !SI_NETBSD) #define SANITIZER_INTERCEPT_MCHECK_MPROBE SI_LINUX_NOT_ANDROID #define SANITIZER_INTERCEPT_WCSLEN 1