From fb9b027842a7b65c4826455cd34d88e2f5f28e79 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20M=C3=A4kel=C3=A4?= Date: Thu, 17 Aug 2017 08:00:58 +0300 Subject: [PATCH] Enable optional use of ASAN AdressSanitizer is a lightweight memory error detector that instruments at compile time instead of at execution time. This allows serious memory errors to be detected without the cost of slowing down the whole program that often happens when Valgrind is used. It is also easier to enable for test runs as it is a simple compiler flag. --- CMakeLists.txt | 6 ++++++ cmake/FindASAN.cmake | 14 ++++++++++++++ cmake/defaults.cmake | 3 +++ 3 files changed, 23 insertions(+) create mode 100644 cmake/FindASAN.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 0cc47eab4..ddcdd6958 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -43,6 +43,7 @@ find_package(LibUUID) find_package(Avro) find_package(GSSAPI) find_package(SQLite) +find_package(ASAN) # Build PCRE2 so we always know the version # Read BuildPCRE2 for details about how to add pcre2 as a dependency to a target @@ -163,6 +164,11 @@ else() set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${FLAGS}") endif() +if (WITH_ASAN AND ASAN_FOUND) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address") +endif() + set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} ${DEBUG_FLAGS} -DSS_DEBUG -DLOG_ASSERT") set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -Wno-uninitialized") set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -ggdb -Wno-uninitialized") diff --git a/cmake/FindASAN.cmake b/cmake/FindASAN.cmake new file mode 100644 index 000000000..dea230ea3 --- /dev/null +++ b/cmake/FindASAN.cmake @@ -0,0 +1,14 @@ +# Find AddressSanitizer libraries +# +# The following variables are set: +# ASAN_FOUND - If AddressSanitizer was found +# ASAN_LIBRARIES - Path to the libasan library + +find_library(ASAN_LIBRARIES NAMES libasan.so.0 libasan.so.3 libasan.so.4) + +if (ASAN_LIBRARIES) + message(STATUS "Found AdressSanitizer libraries: ${ASAN_LIBRARIES}") + set(ASAN_FOUND TRUE CACHE INTERNAL "") +else() + message(STATUS "Could not find AdressSanitizer") +endif() diff --git a/cmake/defaults.cmake b/cmake/defaults.cmake index 5bb62fa3f..3d65d5cc4 100644 --- a/cmake/defaults.cmake +++ b/cmake/defaults.cmake @@ -62,3 +62,6 @@ set(PACKAGE_NAME "maxscale" CACHE STRING "Name of the generated package") # Which component to build (core, experimental, devel) set(TARGET_COMPONENT "core" CACHE STRING "Which component to build (core, experimental, devel, all)") + +# Enable AddressSanitizer: https://github.com/google/sanitizers/wiki/AddressSanitizer +set(WITH_ASAN FALSE CACHE BOOL "Enable AddressSanitizer")