From 9fe79692eb2ce80ba8fd74e6deeeb97504331b27 Mon Sep 17 00:00:00 2001 From: Gabi Melman Date: Fri, 1 Nov 2024 15:14:27 +0200 Subject: [PATCH] Gabime/tsan (#3237) * Fixed race condition in tests * Support for thread sanitizer --- CMakeLists.txt | 11 +++++++++++ cmake/utils.cmake | 13 ++++++++++++- tests/CMakeLists.txt | 6 ++++-- 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b0e501d6..94d43c9d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -80,6 +80,10 @@ option(SPDLOG_BUILD_BENCH "Build benchmarks (Requires https://github.com/google/ # sanitizer options option(SPDLOG_SANITIZE_ADDRESS "Enable address sanitizer in tests" OFF) +option(SPDLOG_SANITIZE_THREAD "Enable thread sanitizer in tests" OFF) +if(SPDLOG_SANITIZE_ADDRESS AND SPDLOG_SANITIZE_THREAD) + message(FATAL_ERROR "SPDLOG_SANITIZE_ADDRESS and SPDLOG_SANITIZE_THREAD are mutually exclusive") +endif() # warning options option(SPDLOG_BUILD_WARNINGS "Enable compiler warnings" OFF) @@ -194,6 +198,13 @@ if(COMMAND target_precompile_headers AND SPDLOG_ENABLE_PCH) target_precompile_headers(spdlog PRIVATE ${PROJECT_BINARY_DIR}/spdlog_pch.h) endif() +# sanitizer support +if(SPDLOG_SANITIZE_ADDRESS) + spdlog_enable_addr_sanitizer(spdlog) +elseif (SPDLOG_SANITIZE_THREAD) + spdlog_enable_thread_sanitizer(spdlog) +endif () + # --------------------------------------------------------------------------------------- # Header only version # --------------------------------------------------------------------------------------- diff --git a/cmake/utils.cmake b/cmake/utils.cmake index 85fcd80f..0e340bcc 100644 --- a/cmake/utils.cmake +++ b/cmake/utils.cmake @@ -49,7 +49,7 @@ function(spdlog_enable_warnings target_name) endfunction() # Enable address sanitizer (gcc/clang only) -function(spdlog_enable_sanitizer target_name) +function(spdlog_enable_addr_sanitizer target_name) if(NOT CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang") message(FATAL_ERROR "Sanitizer supported only for gcc/clang") endif() @@ -60,3 +60,14 @@ function(spdlog_enable_sanitizer target_name) target_compile_options(${target_name} PRIVATE -fno-omit-frame-pointer) target_link_libraries(${target_name} PRIVATE -fsanitize=address,undefined -fuse-ld=gold) endfunction() + +# Enable thread sanitizer (gcc/clang only) +function(spdlog_enable_thread_sanitizer target_name) + if(NOT CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang") + message(FATAL_ERROR "Sanitizer supported only for gcc/clang") + endif() + message(STATUS "Thread sanitizer enabled") + target_compile_options(${target_name} PRIVATE -fsanitize=thread) + target_compile_options(${target_name} PRIVATE -fno-omit-frame-pointer) + target_link_libraries(${target_name} PRIVATE -fsanitize=thread -fuse-ld=gold) +endfunction() diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 8300887a..0a3d77eb 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -73,8 +73,10 @@ function(spdlog_prepare_test test_target spdlog_lib) endif() target_link_libraries(${test_target} PRIVATE Catch2::Catch2WithMain) if(SPDLOG_SANITIZE_ADDRESS) - spdlog_enable_sanitizer(${test_target}) - endif() + spdlog_enable_addr_sanitizer(${test_target}) + elseif (SPDLOG_SANITIZE_THREAD) + spdlog_enable_thread_sanitizer(${test_target}) + endif () add_test(NAME ${test_target} COMMAND ${test_target}) set_tests_properties(${test_target} PROPERTIES RUN_SERIAL ON) endfunction()