From d88384ed464fe7c356f5cef35a03059dc6aee7e4 Mon Sep 17 00:00:00 2001
From: Tomas Pecka <peckato1@fit.cvut.cz>
Date: Wed, 23 Jan 2019 15:54:47 +0100
Subject: [PATCH] CMake: Support for sanitizers (-DSANITIZER=<san>)

---
 CMake/CMakeLists_root.txt |  3 +++
 CMake/sanitizer.cmake     | 36 ++++++++++++++++++++++++++++++++++++
 2 files changed, 39 insertions(+)
 create mode 100644 CMake/sanitizer.cmake

diff --git a/CMake/CMakeLists_root.txt b/CMake/CMakeLists_root.txt
index 4b450dc246..8f5815ae84 100644
--- a/CMake/CMakeLists_root.txt
+++ b/CMake/CMakeLists_root.txt
@@ -53,6 +53,9 @@ endif ()
 # Flags according to Debug/Release decision
 #  - CMake uses -g on Debug implicitly
 #  - fPIC for libraries will be enabled explicitly
+#  - add sanitizer? -DSANITIZE=<sanitizer>
+include(sanitizer)
+
 set(ALIB_BUILD_FLAGS_COMMON -Wall -pedantic -pipe -Wextra -Werror -Wshadow -Wpointer-arith -Wcast-qual -Wdelete-non-virtual-dtor -Wredundant-decls)
 set(ALIB_BUILD_FLAGS_DEBUG ${{ALIB_BUILD_FLAGS_COMMON}} -Og)
 set(ALIB_BUILD_FLAGS_RELEASE ${{ALIB_BUILD_FLAGS_COMMON}} -O3)
diff --git a/CMake/sanitizer.cmake b/CMake/sanitizer.cmake
new file mode 100644
index 0000000000..8168607dcc
--- /dev/null
+++ b/CMake/sanitizer.cmake
@@ -0,0 +1,36 @@
+# Adapted from: https://github.com/Eyescale/CMake/blob/master/Sanitizer.cmake
+
+if(NOT SANITIZER)
+	return()
+endif()
+
+# According to: http://clang.llvm.org/docs/AddressSanitizer.html#usage
+# the following compiler flags allow us to keep -O1 on, if desired, but
+# still get pretty call stacks
+# set(_SANITIZER_COMPILE_OPTIONS "-g -fno-omit-frame-pointer -fno-optimize-sibling-calls")
+
+string(TOLOWER ${SANITIZER} SANITIZER)
+set(AVAILABLE_SANITIZERS "")
+
+if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
+	if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 4.7)
+		set(AVAILABLE_SANITIZERS address thread)
+	endif()
+
+elseif (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
+	if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 4.1)
+		set(AVAILABLE_SANITIZERS address thread undefined)
+	endif()
+endif()
+
+list(FIND AVAILABLE_SANITIZERS ${SANITIZER} _SANITIZER_FOUND)
+
+if(${_SANITIZER_FOUND} GREATER -1)
+	set(_SANITIZER "-fsanitize=${SANITIZER}")
+
+	add_compile_options("-fno-omit-frame-pointer" ${_SANITIZER})
+	set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${_SANITIZER}")
+
+else()
+	message(WARNING "Sanitizer '${SANITIZER}' not set, check compiler support.")
+endif()
-- 
GitLab