From c1d8e204aacfc97fcf39433ff50b9b80d8f3969f Mon Sep 17 00:00:00 2001
From: Sebastien Gilles <sebastien.gilles@inria.fr>
Date: Fri, 18 May 2018 18:11:50 +0200
Subject: [PATCH] #1288 Add a new flag for sanitizer support.

---
 cmake/MoReFEMSettings.cmake                        | 14 +++++++++++---
 cmake/PreCache/linux_gcc_shared_lib.cmake          |  2 ++
 cmake/PreCache/linux_gcc_static_lib.cmake          |  3 +++
 cmake/PreCache/macos_clang_shared.cmake            |  1 +
 cmake/PreCache/macos_clang_static.cmake            |  2 ++
 .../PreCache/macos_clang_static_several_lib.cmake  |  2 ++
 cmake/PreCache/macos_llvm-clang_static.cmake       |  2 ++
 7 files changed, 23 insertions(+), 3 deletions(-)

diff --git a/cmake/MoReFEMSettings.cmake b/cmake/MoReFEMSettings.cmake
index e1f78608aa..74a06de928 100644
--- a/cmake/MoReFEMSettings.cmake
+++ b/cmake/MoReFEMSettings.cmake
@@ -58,9 +58,6 @@ if(${CMAKE_C_COMPILER_ID} STREQUAL "AppleClang" OR ${CMAKE_C_COMPILER_ID} STREQU
     add_cxx_compiler_flag("-Wno-undefined-func-template")
     add_cxx_compiler_flag("-Wno-c++1z-extensions")
     
-
-#    add_cxx_compiler_flag("-stdlib=libc++") 
-    
     if (${CMAKE_BUILD_TYPE} STREQUAL "Debug")
         add_definitions(-D_LIBCPP_DEBUG2=0) # Additional checks such as index out of bounds in vectors in libc++; might 
                                             # be removed at any point from libc++.
@@ -109,6 +106,17 @@ else()
     message(FATAL_ERROR "Sorry, your compiler family wasn't recognized. If CMake has updated its flag, please modify the cmake/Compiler.cmake file in MoReFEM accoerdingly. See CMAKE_LANG_COMPILER_ID in CMake tutorial to find out the valid options.")
 endif()
 
+if (${MOREFEM_DO_SANITIZE})
+    add_cxx_compiler_flag("-fno-omit-frame-pointer")
+    add_cxx_compiler_flag("-fsanitize=address")
+    add_cxx_compiler_flag("-fsanitize=leak")
+    
+    if(LIBRARY_TYPE MATCHES SHARED) # See limitations on https://clang.llvm.org/docs/MemorySanitizer.html
+        add_cxx_compiler_flag("-fsanitize=memory")
+    endif()
+    
+endif()
+
 
 set(MOREFEM_INSTALL_DIR ${CMAKE_INSTALL_PREFIX}/${PROJECT_NAME})
 
diff --git a/cmake/PreCache/linux_gcc_shared_lib.cmake b/cmake/PreCache/linux_gcc_shared_lib.cmake
index 09eec38b89..76bad4d264 100644
--- a/cmake/PreCache/linux_gcc_shared_lib.cmake
+++ b/cmake/PreCache/linux_gcc_shared_lib.cmake
@@ -8,6 +8,8 @@ set(CMAKE_CXX_COMPILER ${MOREFEM_THIRD_PARTY_LIBRARIES_DIR}/Openmpi/bin/mpic++ C
 set(CMAKE_CXX_STANDARD 17 CACHE STRING "C++ standard; at least 17 is expected.")
 set(CMAKE_CXX_STANDARD_REQUIRED ON CACHE STRING "Leave this one active.")
 set(CMAKE_CXX_EXTENSIONS OFF CACHE STRING "If ON you might be using gnu++17; with OFF you'll use c++17.")
+    
+set(MOREFEM_DO_SANITIZE False CACHE BOOL "If true, sanitizer options -fsanitize=address, -fsanitize=memory and -fno-omit-frame-pointer are added.")
 
 set(LIBRARY_TYPE SHARED CACHE BOOL "Choose either STATIC or SHARED.")
 
diff --git a/cmake/PreCache/linux_gcc_static_lib.cmake b/cmake/PreCache/linux_gcc_static_lib.cmake
index e17062119c..b9c5d0a897 100644
--- a/cmake/PreCache/linux_gcc_static_lib.cmake
+++ b/cmake/PreCache/linux_gcc_static_lib.cmake
@@ -9,6 +9,9 @@ set(CMAKE_CXX_STANDARD 17 CACHE STRING "C++ standard; at least 17 is expected.")
 set(CMAKE_CXX_STANDARD_REQUIRED ON CACHE STRING "Leave this one active.")
 set(CMAKE_CXX_EXTENSIONS OFF CACHE STRING "If ON you might be using gnu++17; with OFF you'll use c++17.")
 
+
+set(MOREFEM_DO_SANITIZE False CACHE BOOL "If true, sanitizer options -fsanitize=address, -fsanitize=memory and -fno-omit-frame-pointer are added.")
+    
 set(LIBRARY_TYPE STATIC CACHE BOOL "Choose either STATIC or SHARED.")
 
 set(BUILD_MOREFEM_UNIQUE_LIBRARY True CACHE BOOL "Whether a unique library is built for MoReFEM core libraries or on the contrary if it is splitted in modules.")
diff --git a/cmake/PreCache/macos_clang_shared.cmake b/cmake/PreCache/macos_clang_shared.cmake
index 01ea30b626..f6e1853eb4 100644
--- a/cmake/PreCache/macos_clang_shared.cmake
+++ b/cmake/PreCache/macos_clang_shared.cmake
@@ -5,6 +5,7 @@ set(MOREFEM_THIRD_PARTY_LIBRARIES_DIR /Users/Shared/LibraryVersions/clang)
 set(CMAKE_C_COMPILER ${MOREFEM_THIRD_PARTY_LIBRARIES_DIR}/Openmpi/bin/mpicc CACHE FILEPATH "C compiler. Prefer to use an openmpi wrapper.")
 set(CMAKE_CXX_COMPILER ${MOREFEM_THIRD_PARTY_LIBRARIES_DIR}/Openmpi/bin/mpic++ CACHE FILEPATH "C++ compiler. Prefer to use an openmpi wrapper.")
 
+set(MOREFEM_DO_SANITIZE False CACHE BOOL "If true, sanitizer options -fsanitize=address, -fsanitize=memory and -fno-omit-frame-pointer are added.")
 
 set(CMAKE_CXX_STANDARD 17 CACHE STRING "C++ standard; at least 17 is expected.")
 set(CMAKE_CXX_STANDARD_REQUIRED ON CACHE STRING "Leave this one active.")
diff --git a/cmake/PreCache/macos_clang_static.cmake b/cmake/PreCache/macos_clang_static.cmake
index 91dbe34f70..40eab811c9 100644
--- a/cmake/PreCache/macos_clang_static.cmake
+++ b/cmake/PreCache/macos_clang_static.cmake
@@ -5,6 +5,8 @@ set(MOREFEM_THIRD_PARTY_LIBRARIES_DIR /Users/Shared/LibraryVersions/clang)
 set(CMAKE_C_COMPILER ${MOREFEM_THIRD_PARTY_LIBRARIES_DIR}/Openmpi/bin/mpicc CACHE FILEPATH "C compiler. Prefer to use an openmpi wrapper.")
 set(CMAKE_CXX_COMPILER ${MOREFEM_THIRD_PARTY_LIBRARIES_DIR}/Openmpi/bin/mpic++ CACHE FILEPATH "C++ compiler. Prefer to use an openmpi wrapper.")
 
+set(MOREFEM_DO_SANITIZE False CACHE BOOL "If true, sanitizer options -fsanitize=address, -fsanitize=memory and -fno-omit-frame-pointer are added.")
+
 set(CMAKE_CXX_STANDARD 17 CACHE STRING "C++ standard; at least 17 is expected.")
 set(CMAKE_CXX_STANDARD_REQUIRED ON CACHE STRING "Leave this one active.")
 set(CMAKE_CXX_EXTENSIONS OFF CACHE STRING "If ON you might be using gnu++17; with OFF you'll use c++17.")
diff --git a/cmake/PreCache/macos_clang_static_several_lib.cmake b/cmake/PreCache/macos_clang_static_several_lib.cmake
index 1f947e268e..b5fe4f489a 100644
--- a/cmake/PreCache/macos_clang_static_several_lib.cmake
+++ b/cmake/PreCache/macos_clang_static_several_lib.cmake
@@ -9,6 +9,8 @@ set(CMAKE_CXX_STANDARD 17 CACHE STRING "C++ standard; at least 17 is expected.")
 set(CMAKE_CXX_STANDARD_REQUIRED ON CACHE STRING "Leave this one active.")
 set(CMAKE_CXX_EXTENSIONS OFF CACHE STRING "If ON you might be using gnu++17; with OFF you'll use c++17.")
 
+set(MOREFEM_DO_SANITIZE False CACHE BOOL "If true, sanitizer options -fsanitize=address, -fsanitize=memory and -fno-omit-frame-pointer are added.")
+
 set(LIBRARY_TYPE STATIC CACHE BOOL "Choose either STATIC or SHARED.")
 
 set(BUILD_MOREFEM_UNIQUE_LIBRARY False CACHE BOOL "Whether a unique library is built for MoReFEM core libraries or on the contrary if it is splitted in modules.")
diff --git a/cmake/PreCache/macos_llvm-clang_static.cmake b/cmake/PreCache/macos_llvm-clang_static.cmake
index e95b712432..bd7582a275 100644
--- a/cmake/PreCache/macos_llvm-clang_static.cmake
+++ b/cmake/PreCache/macos_llvm-clang_static.cmake
@@ -5,6 +5,8 @@ set(MOREFEM_THIRD_PARTY_LIBRARIES_DIR /Users/Shared/LibraryVersions/llvm-clang)
 set(CMAKE_C_COMPILER ${MOREFEM_THIRD_PARTY_LIBRARIES_DIR}/Openmpi/bin/mpicc CACHE FILEPATH "C compiler. Prefer to use an openmpi wrapper.")
 set(CMAKE_CXX_COMPILER ${MOREFEM_THIRD_PARTY_LIBRARIES_DIR}/Openmpi/bin/mpic++ CACHE FILEPATH "C++ compiler. Prefer to use an openmpi wrapper.")
 
+set(MOREFEM_DO_SANITIZE False CACHE BOOL "If true, sanitizer options -fsanitize=address, -fsanitize=memory and -fno-omit-frame-pointer are added.")
+
 set(CMAKE_CXX_STANDARD 17 CACHE STRING "C++ standard; at least 17 is expected.")
 set(CMAKE_CXX_STANDARD_REQUIRED ON CACHE STRING "Leave this one active.")
 set(CMAKE_CXX_EXTENSIONS OFF CACHE STRING "If ON you might be using gnu++17; with OFF you'll use c++17.")
-- 
GitLab