From 8bc2ba5ebd2ec8268b777243b520963333389328 Mon Sep 17 00:00:00 2001 From: Johann Cohen-Tanugi Date: Thu, 12 Sep 2024 22:30:11 +0200 Subject: [PATCH] add cmake directive for building with thread sanitizing --- CMakeLists.txt | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 2a83637..0e9313c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -64,6 +64,18 @@ else() add_compile_options("-mno-vzeroupper" "-mavx2" "-floop-unroll-and-jam" ) endif() +# only set these flags if testing presence of race conditions : +# https://github.com/google/sanitizers/wiki/ThreadSanitizerCppManual +# on linux/gcc it seems that one needs to run with LD_PRELOAD=/lib/x86_64-linux-gnu/libtsan.so.0 prepended +# and do a `sudo sysctl vm.mmap_rnd_bits=28` prior to running +if(DEFINED ENV{SANITIZE_THREAD}) + message(STATUS "Building with thread sanitizing enabled.") + SET(GCC_COVERAGE_COMPILE_FLAGS "-g -O2 -fsanitize=thread") + SET(GCC_COVERAGE_LINK_FLAGS "-fsanitize=thread") + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${GCC_COVERAGE_COMPILE_FLAGS}") + SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${GCC_COVERAGE_LINK_FLAGS}") +endif() + if(DEFINED ENV{INCLUDE_COVERAGE} AND DEFINED ENV{SANITIZE_ADDRESS}) message(FATAL_ERROR "Conflicting build options: INCLUDE_COVERAGE and SANITIZE_ADDRESS") endif() @@ -72,9 +84,9 @@ endif() if(DEFINED ENV{INCLUDE_COVERAGE}) message(STATUS "Building with code coverage enabled.") SET(GCC_COVERAGE_COMPILE_FLAGS "-g -O0 -coverage -fprofile-arcs -ftest-coverage") - SET(GCC_COVERAGE_LINK_FLAGS "-coverage -lgcov") - SET( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${GCC_COVERAGE_COMPILE_FLAGS}" ) - SET( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${GCC_COVERAGE_LINK_FLAGS}" ) + SET(GCC_COVERAGE_LINK_FLAGS "-coverage -lgcov -lpthread") + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${GCC_COVERAGE_COMPILE_FLAGS}") + SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${GCC_COVERAGE_LINK_FLAGS}") endif() # Enable the address sanitizer with an environment variable.