[rtsan] Intercept aligned_alloc on all versions of OSX if available on build machine (#112780)

This commit is contained in:
Chris Apple
2024-10-28 10:33:29 -07:00
committed by GitHub
parent 98e3075df9
commit 97fb21ac1d
2 changed files with 34 additions and 7 deletions

View File

@@ -122,14 +122,21 @@ TEST(TestRtsanInterceptors, VallocDiesWhenRealtime) {
ExpectNonRealtimeSurvival(Func);
}
#if SANITIZER_INTERCEPT_ALIGNED_ALLOC
TEST(TestRtsanInterceptors, AlignedAllocDiesWhenRealtime) {
auto Func = []() { EXPECT_NE(nullptr, aligned_alloc(16, 32)); };
ExpectRealtimeDeath(Func, "aligned_alloc");
ExpectNonRealtimeSurvival(Func);
}
#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) {
if (ALIGNED_ALLOC_AVAILABLE()) {
auto Func = []() { EXPECT_NE(nullptr, aligned_alloc(16, 32)); };
ExpectRealtimeDeath(Func, "aligned_alloc");
ExpectNonRealtimeSurvival(Func);
}
}
// free_sized and free_aligned_sized (both C23) are not yet supported
TEST(TestRtsanInterceptors, FreeDiesWhenRealtime) {
void *ptr_1 = malloc(1);

View File

@@ -84,6 +84,25 @@
#define SI_NOT_MAC 1
#endif
#if SANITIZER_APPLE
# include <Availability.h>
// 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