yams/cmake/Sanitizers.cmake

50 lines
1.6 KiB
CMake

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()