include(CheckCXXCompilerFlag) include(CheckLinkerFlag) check_linker_flag(CXX -fsanitize=address cxx_asan) check_cxx_compiler_flag(-fsanitize=leak cxx_lsan) function(target_sanitize target_name) option(sanitize_address "Use address sanitizer" ${cxx_asan}) option(sanitize_leak "Use leak sanitizer" ${cxx_lsan}) if(sanitize_address) message(">>> using asan on ${target_name}") target_compile_options(${target_name} PRIVATE -fsanitize=address -fno-optimize-sibling-calls -fsanitize-address-use-after-scope -fno-omit-frame-pointer) target_link_options(${target_name} PRIVATE -fsanitize=address) endif() if(sanitize_leak) message(">>> using lsan on ${target_name}") target_compile_options(${target_name} PRIVATE -fsanitize=leak -fno-omit-frame-pointer) target_link_options(${target_name} PRIVATE -fsanitize=leak) endif() endfunction() function(target_sanitize_fuzzer target_name) if(NOT ${CMAKE_CXX_COMPILER_ID} MATCHES Clang) message("Cannot sanitize with ${CMAKE_CXX_COMPILER_ID} (needs clang)") return() endif() set_target_properties(${target_name} PROPERTIES COMPILE_FLAGS "${CMAKE_CXX_FLAGS} -g -fsanitize=fuzzer" LINK_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=fuzzer") endfunction()