diff --git a/compiler-rt/lib/rtsan/tests/CMakeLists.txt b/compiler-rt/lib/rtsan/tests/CMakeLists.txt index 3b783c90c2658..0320bbad59218 100644 --- a/compiler-rt/lib/rtsan/tests/CMakeLists.txt +++ b/compiler-rt/lib/rtsan/tests/CMakeLists.txt @@ -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) diff --git a/compiler-rt/lib/rtsan/tests/rtsan_test_functional.cpp b/compiler-rt/lib/rtsan/tests/rtsan_test_functional.cpp index 97afb1eefb640..6e7ab016a4c6b 100644 --- a/compiler-rt/lib/rtsan/tests/rtsan_test_functional.cpp +++ b/compiler-rt/lib/rtsan/tests/rtsan_test_functional.cpp @@ -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 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> large_atomic; ASSERT_FALSE(large_atomic.is_lock_free()); - auto Func = [&]() { auto x = large_atomic.load(); }; + auto Func = [&]() { + std::array x = large_atomic.load(); + return x; + }; ExpectRealtimeDeath(Func); ExpectNonRealtimeSurvival(Func); } diff --git a/compiler-rt/lib/rtsan/tests/rtsan_test_interceptors.cpp b/compiler-rt/lib/rtsan/tests/rtsan_test_interceptors.cpp index 8861104068c8e..47c07b3e47abd 100644 --- a/compiler-rt/lib/rtsan/tests/rtsan_test_interceptors.cpp +++ b/compiler-rt/lib/rtsan/tests/rtsan_test_interceptors.cpp @@ -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"); diff --git a/compiler-rt/test/rtsan/CMakeLists.txt b/compiler-rt/test/rtsan/CMakeLists.txt index e1f9eb39408dc..59fc5a29703fe 100644 --- a/compiler-rt/test/rtsan/CMakeLists.txt +++ b/compiler-rt/test/rtsan/CMakeLists.txt @@ -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) diff --git a/compiler-rt/test/rtsan/basic.cpp b/compiler-rt/test/rtsan/basic.cpp new file mode 100644 index 0000000000000..ec7382cb0ecaf --- /dev/null +++ b/compiler-rt/test/rtsan/basic.cpp @@ -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 +#include + +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*}} +} diff --git a/compiler-rt/test/rtsan/inactive.cpp b/compiler-rt/test/rtsan/inactive.cpp new file mode 100644 index 0000000000000..69edc63a4cfd4 --- /dev/null +++ b/compiler-rt/test/rtsan/inactive.cpp @@ -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 +#include + +// 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.*}} +} diff --git a/compiler-rt/test/sanitizer_common/lit.common.cfg.py b/compiler-rt/test/sanitizer_common/lit.common.cfg.py index 04af4816eb6e7..5406e8838f2fc 100644 --- a/compiler-rt/test/sanitizer_common/lit.common.cfg.py +++ b/compiler-rt/test/sanitizer_common/lit.common.cfg.py @@ -18,6 +18,9 @@ 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"