[compiler-rt][rtsan] Introduce first end to end RTsan lit tests, enable instrumented unit tests (#105732)

This commit is contained in:
Chris Apple 2024-08-26 06:39:24 -07:00 committed by GitHub
parent 6f092e501b
commit ca95bee649
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 67 additions and 23 deletions

View File

@ -60,14 +60,13 @@ endif()
foreach(arch ${RTSAN_TEST_ARCH})
set(RtsanTestObjects)
# TODO: Re-enable once -fsanitize=realtime exists in clang driver
#generate_compiler_rt_tests(RtsanTestObjects
# RtsanUnitTests "Rtsan-${arch}-Test" ${arch}
# COMPILE_DEPS ${RTSAN_UNITTEST_HEADERS}
# SOURCES ${RTSAN_INST_TEST_SOURCES} ${COMPILER_RT_GOOGLETEST_SOURCES}
# DEPS rtsan
# CFLAGS ${RTSAN_UNITTEST_CFLAGS} -fsanitize=realtime
# LINK_FLAGS ${RTSAN_UNITTEST_LINK_FLAGS} -fsanitize=realtime)
generate_compiler_rt_tests(RtsanTestObjects
RtsanUnitTests "Rtsan-${arch}-Test" ${arch}
COMPILE_DEPS ${RTSAN_UNITTEST_HEADERS}
SOURCES ${RTSAN_INST_TEST_SOURCES} ${COMPILER_RT_GOOGLETEST_SOURCES}
DEPS rtsan
CFLAGS ${RTSAN_UNITTEST_CFLAGS} -fsanitize=realtime
LINK_FLAGS ${RTSAN_UNITTEST_LINK_FLAGS} -fsanitize=realtime)
set(RTSAN_TEST_RUNTIME RTRtsanTest.${arch})
if(APPLE)

View File

@ -145,7 +145,7 @@ TEST(TestRtsan, CopyingALambdaWithLargeCaptureDiesWhenRealtime) {
auto lambda = [lots_of_data]() mutable {
// Stop everything getting optimised out
lots_of_data[3] = 0.25f;
EXPECT_EQ(16, lots_of_data.size());
EXPECT_EQ(16u, lots_of_data.size());
EXPECT_EQ(0.25f, lots_of_data[3]);
};
auto Func = [&]() { InvokeStdFunction(lambda); };
@ -156,11 +156,17 @@ TEST(TestRtsan, CopyingALambdaWithLargeCaptureDiesWhenRealtime) {
TEST(TestRtsan, AccessingALargeAtomicVariableDiesWhenRealtime) {
std::atomic<float> small_atomic{0.0f};
ASSERT_TRUE(small_atomic.is_lock_free());
RealtimeInvoke([&small_atomic]() { float x = small_atomic.load(); });
RealtimeInvoke([&small_atomic]() {
float x = small_atomic.load();
return x;
});
std::atomic<std::array<float, 2048>> large_atomic;
ASSERT_FALSE(large_atomic.is_lock_free());
auto Func = [&]() { auto x = large_atomic.load(); };
auto Func = [&]() {
std::array<float, 2048> x = large_atomic.load();
return x;
};
ExpectRealtimeDeath(Func);
ExpectNonRealtimeSurvival(Func);
}

View File

@ -321,7 +321,7 @@ TEST(TestRtsanInterceptors, PthreadCreateDiesWhenRealtime) {
auto Func = []() {
pthread_t thread{};
const pthread_attr_t attr{};
struct thread_info *thread_info;
struct thread_info *thread_info{};
pthread_create(&thread, &attr, &FakeThreadEntryPoint, thread_info);
};
ExpectRealtimeDeath(Func, "pthread_create");

View File

@ -1,14 +1,3 @@
######
# TODO: Full lit tests coming in a future review when we introduce the codegen
######
set(RTSAN_LIT_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
set(RTSAN_TESTSUITES)

View File

@ -0,0 +1,21 @@
// RUN: %clangxx -fsanitize=realtime %s -o %t
// RUN: not %run %t 2>&1 | FileCheck %s
// UNSUPPORTED: ios
// Intent: Ensure that an intercepted call in a [[clang::nonblocking]] function
// is flagged as an error. Basic smoke test.
#include <stdio.h>
#include <stdlib.h>
void violation() [[clang::nonblocking]] {
void *ptr = malloc(2);
printf("ptr: %p\n", ptr); // ensure we don't optimize out the malloc
}
int main() {
violation();
return 0;
// CHECK: {{.*Real-time violation.*}}
// CHECK: {{.*malloc*}}
}

View File

@ -0,0 +1,26 @@
// RUN: %clangxx %s -o %t
// RUN: %run %t 2>&1 | FileCheck %s
// UNSUPPORTED: ios
// Intent: Ensure [[clang::nonblocking]] has no impact if -fsanitize=realtime is not used
#include <stdio.h>
#include <stdlib.h>
// In this test, we don't use the -fsanitize=realtime flag, so nothing
// should happen here
void violation() [[clang::nonblocking]] {
void *ptr = malloc(2);
printf("ptr: %p\n", ptr); // ensure we don't optimize out the malloc
}
int main() {
printf("Starting run\n");
violation();
printf("No violations ended the program\n");
return 0;
// CHECK: {{.*Starting run.*}}
// CHECK NOT: {{.*Real-time violation.*}}
// CHECK NOT: {{.*malloc*}}
// CHECK: {{.*No violations ended the program.*}}
}

View File

@ -18,6 +18,9 @@ elif config.tool_name == "hwasan":
tool_options = "HWASAN_OPTIONS"
if not config.has_lld:
config.unsupported = True
elif config.tool_name == "rtsan":
tool_cflags = ["-fsanitize=realtime"]
tool_options = "RTSAN_OPTIONS"
elif config.tool_name == "tsan":
tool_cflags = ["-fsanitize=thread"]
tool_options = "TSAN_OPTIONS"