From e237b6a2afb0bc81fa4d95983ab8584b6305086b Mon Sep 17 00:00:00 2001 From: Ian McInerney Date: Fri, 16 Apr 2021 15:53:13 +0100 Subject: [PATCH] Add thread sanitizer support to Cmake --- CMakeLists.txt | 27 +++++++++++++++++++++++---- common/build_version.cpp | 11 +++++++++-- 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 2930d54b46..5da892963d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -107,7 +107,12 @@ option( KICAD_I18N_UNIX_STRICT_PATH OFF ) # Not supported by all platforms (for instance mingw) -option( KICAD_SANITIZE +option( KICAD_SANITIZE_ADDRESS + "Build KiCad with sanitizer options. WARNING: Not compatible with gold linker" + OFF ) + +# Not supported by all platforms (for instance mingw) +option( KICAD_SANITIZE_THREADS "Build KiCad with sanitizer options. WARNING: Not compatible with gold linker" OFF ) @@ -245,7 +250,7 @@ if( WIN32 ) # Used for the resource compiler and other arch dependent steps if( MSVC ) - # CMake does not set CMAKE_SYSTEM_PROCESSOR correctly for MSVC + # CMake does not set CMAKE_SYSTEM_PROCESSOR correctly for MSVC # and it will always return the host instead of the target arch if("${MSVC_C_ARCHITECTURE_ID}" STREQUAL "ARM64") set( KICAD_BUILD_ARCH "arm64" ) @@ -341,14 +346,28 @@ if( CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang" ) set( CMAKE_CXX_FLAGS_DEBUG "-g3 -ggdb3" ) endif() - if( KICAD_SANITIZE ) - add_definitions( -DKICAD_SANITIZE ) + if( KICAD_SANITIZE_ADDRESS ) + add_definitions( -DKICAD_SANITIZE_ADDRESS ) set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_GLIBCXX_SANITIZE_VECTOR -fsanitize=address -fno-optimize-sibling-calls -fsanitize-address-use-after-scope -fno-omit-frame-pointer" ) # ASAN shouldn't be used with these options (https://github.com/google/sanitizers/wiki/AddressSanitizer#faq) set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-stack-protector -U_FORTIFY_SOURCE" ) endif() + if( KICAD_SANITIZE_THREADS ) + add_definitions( -DKICAD_SANITIZE_THREADS ) + set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_GLIBCXX_SANITIZE_VECTOR -fsanitize=thread -fno-optimize-sibling-calls -fno-omit-frame-pointer" ) + + # Based on this warning https://github.com/JuliaLang/julia/blob/29d5158d27ddc3983ae2e373c4cd05569b9ead6c/src/julia.h#L77 + if( CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 11 ) + message( WARNING "Clang version 11 and below may leak memory when running the thread sanitizer.\n" + "Be careful when using this compiler.") + endif() + + # Just duplicate the same flags as ASAN here, because why not. + set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-stack-protector -U_FORTIFY_SOURCE" ) + endif() + if( KICAD_STDLIB_DEBUG ) add_definitions( -DKICAD_STDLIB_DEBUG ) set( CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -D_GLIBCXX_DEBUG" ) diff --git a/common/build_version.cpp b/common/build_version.cpp index 2bf477fd81..768bfd1ddf 100644 --- a/common/build_version.cpp +++ b/common/build_version.cpp @@ -269,8 +269,15 @@ wxString GetVersionInfoData( const wxString& aTitle, bool aHtml, bool aBrief ) #endif #endif - aMsg << indent4 << "KICAD_SANITIZE="; -#ifdef KICAD_SANITIZE + aMsg << indent4 << "KICAD_SANITIZE_ADDRESS="; +#ifdef KICAD_SANITIZE_ADDRESS + aMsg << ON; +#else + aMsg << OFF; +#endif + + aMsg << indent4 << "KICAD_SANITIZE_THREADS="; +#ifdef KICAD_SANITIZE_THREADS aMsg << ON; #else aMsg << OFF;