include(CheckCXXCompilerFlag) option(ENABLE_ASAN "Enable AddressSanitizer (+UBSan minimal) for Debug builds" OFF) option(ENABLE_UBSAN "Enable UndefinedBehaviorSanitizer for Debug builds" OFF) option(ENABLE_TSAN "Enable ThreadSanitizer for Debug builds" OFF) if(ENABLE_TSAN AND ENABLE_ASAN) message(FATAL_ERROR "ENABLE_TSAN and ENABLE_ASAN cannot be enabled together.") endif() function(_yams_append_flags var) foreach(flag IN LISTS ARGN) set(${var} "${${var}} ${flag}" PARENT_SCOPE) endforeach() endfunction() if(CMAKE_BUILD_TYPE MATCHES "^[Dd]ebug$") set(_SAN_CFLAGS "") set(_SAN_LDFLAGS "") if(ENABLE_ASAN) _yams_append_flags(_SAN_CFLAGS "-fsanitize=address,undefined" "-fno-omit-frame-pointer") _yams_append_flags(_SAN_LDFLAGS "-fsanitize=address,undefined") if(APPLE) _yams_append_flags(_SAN_CFLAGS "-fsanitize-address-use-after-scope") endif() endif() if(ENABLE_UBSAN AND NOT ENABLE_ASAN) _yams_append_flags(_SAN_CFLAGS "-fsanitize=undefined" "-fno-omit-frame-pointer") _yams_append_flags(_SAN_LDFLAGS "-fsanitize=undefined") endif() if(ENABLE_TSAN) _yams_append_flags(_SAN_CFLAGS "-fsanitize=thread" "-fno-omit-frame-pointer") _yams_append_flags(_SAN_LDFLAGS "-fsanitize=thread") endif() if(_SAN_CFLAGS) add_compile_options(${_SAN_CFLAGS}) add_link_options(${_SAN_LDFLAGS}) if(UNIX AND NOT APPLE) add_compile_options(-gline-tables-only) endif() message(STATUS "Sanitizers enabled: ${_SAN_CFLAGS}") set(YAMS_ENABLE_SANITIZERS ON CACHE BOOL "Sanitizers enabled" FORCE) else() set(YAMS_ENABLE_SANITIZERS OFF CACHE BOOL "Sanitizers enabled" FORCE) endif() endif()