From b3e88e480fc333fe410824766c691c41f22e5f61 Mon Sep 17 00:00:00 2001 From: Danila Kutenin Date: Fri, 18 Feb 2022 18:35:26 +0000 Subject: [PATCH] Add sanitize options --- CMakeLists.txt | 2 ++ cmake/sanitize.cmake | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 cmake/sanitize.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 57a54033..db299cc8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -124,6 +124,8 @@ if (RELEASE_BUILD) set(HS_OPTIMIZE ON) endif() +include (${CMAKE_MODULE_PATH}/sanitize.cmake) + CMAKE_DEPENDENT_OPTION(DUMP_SUPPORT "Dump code support; normally on, except in release builds" ON "NOT RELEASE_BUILD" OFF) CMAKE_DEPENDENT_OPTION(DISABLE_ASSERTS "Disable assert(); Asserts are enabled in debug builds, disabled in release builds" OFF "NOT RELEASE_BUILD" ON) diff --git a/cmake/sanitize.cmake b/cmake/sanitize.cmake new file mode 100644 index 00000000..2c1ce068 --- /dev/null +++ b/cmake/sanitize.cmake @@ -0,0 +1,40 @@ +# Possible values: +# - `address` (ASan) +# - `memory` (MSan) +# - `undefined` (UBSan) +# - "" (no sanitizing) +option (SANITIZE "Enable one of the code sanitizers" "") + +set (SAN_FLAGS "${SAN_FLAGS} -g -fno-omit-frame-pointer -DSANITIZER") + +if (SANITIZE) + if (SANITIZE STREQUAL "address") + set (ASAN_FLAGS "-fsanitize=address -fsanitize-address-use-after-scope") + set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${SAN_FLAGS} ${ASAN_FLAGS}") + set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${SAN_FLAGS} ${ASAN_FLAGS}") + + if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") + set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${ASAN_FLAGS}") + endif() + + elseif (SANITIZE STREQUAL "memory") + if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") + set (FATAL_ERROR "GCC does not have memory sanitizer") + endif() + # MemorySanitizer flags are set according to the official documentation: + # https://clang.llvm.org/docs/MemorySanitizer.html#usage + set (MSAN_FLAGS "-fsanitize=memory -fsanitize-memory-use-after-dtor -fsanitize-memory-track-origins -fno-optimize-sibling-calls") + + set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${SAN_FLAGS} ${MSAN_FLAGS}") + set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${SAN_FLAGS} ${MSAN_FLAGS}") + elseif (SANITIZE STREQUAL "undefined") + set (UBSAN_FLAGS "-fsanitize=undefined") + set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${SAN_FLAGS} ${UBSAN_FLAGS}") + set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${SAN_FLAGS} ${UBSAN_FLAGS}") + if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") + set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=undefined") + endif() + else () + message (FATAL_ERROR "Unknown sanitizer type: ${SANITIZE}") + endif () +endif()