]> git.ipfire.org Git - thirdparty/vectorscan.git/commitdiff
Add sanitize options
authorDanila Kutenin <danilak@google.com>
Fri, 18 Feb 2022 18:35:26 +0000 (18:35 +0000)
committerDanila Kutenin <danilak@google.com>
Fri, 18 Feb 2022 18:35:26 +0000 (18:35 +0000)
CMakeLists.txt
cmake/sanitize.cmake [new file with mode: 0644]

index 57a54033381804c4630ed3bd0dc6cdb3424f6d7e..db299cc8230e6b86227954f72d2ae19c2f85700b 100644 (file)
@@ -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 (file)
index 0000000..2c1ce06
--- /dev/null
@@ -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()