diff options
Diffstat (limited to 'cmake/Sanitize.cmake')
-rw-r--r-- | cmake/Sanitize.cmake | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/cmake/Sanitize.cmake b/cmake/Sanitize.cmake new file mode 100644 index 0000000..29f7fa5 --- /dev/null +++ b/cmake/Sanitize.cmake @@ -0,0 +1,33 @@ +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() |