aboutsummaryrefslogtreecommitdiff
path: root/cmake/Sanitize.cmake
diff options
context:
space:
mode:
Diffstat (limited to 'cmake/Sanitize.cmake')
-rw-r--r--cmake/Sanitize.cmake33
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()