[compiler-rt][rtsan] Introduce first end to end RTsan lit tests, enable instrumented unit tests (#105732)
This commit is contained in:
parent
6f092e501b
commit
ca95bee649
@ -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)
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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");
|
||||
|
@ -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)
|
||||
|
21
compiler-rt/test/rtsan/basic.cpp
Normal file
21
compiler-rt/test/rtsan/basic.cpp
Normal 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*}}
|
||||
}
|
26
compiler-rt/test/rtsan/inactive.cpp
Normal file
26
compiler-rt/test/rtsan/inactive.cpp
Normal 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.*}}
|
||||
}
|
@ -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"
|
||||
|
Loading…
x
Reference in New Issue
Block a user