Refined checks for sanitizers.
authorArmin Novak <armin.novak@thincast.com>
Thu, 12 Apr 2018 09:49:43 +0000 (11:49 +0200)
committerArmin Novak <armin.novak@thincast.com>
Thu, 12 Apr 2018 10:41:19 +0000 (12:41 +0200)
CMakeLists.txt

index 134dc40..a3f2515 100644 (file)
@@ -328,102 +328,104 @@ endif()
 
 # Enable address sanitizer, where supported and when required
 if(${CMAKE_C_COMPILER_ID} STREQUAL "Clang" OR CMAKE_COMPILER_IS_GNUCC)
+       set(CMAKE_REQUIRED_FLAGS_SAVED ${CMAKE_REQUIRED_FLAGS})
+
+       CHECK_C_COMPILER_FLAG ("-fno-omit-frame-pointer" fno-omit-frame-pointer)
+
+       file(WRITE ${CMAKE_BINARY_DIR}/foo.txt "")
        if(WITH_SANITIZE_ADDRESS)
-               if (DEFINED CMAKE_REQUIRED_FLAGS)
-                       set(SAVE_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
-               endif()
                set(CMAKE_REQUIRED_FLAGS "-fsanitize=address")
                CHECK_C_COMPILER_FLAG ("-fsanitize=address" fsanitize-address)
+               CHECK_C_COMPILER_FLAG ("-fsanitize-blacklist=${CMAKE_BINARY_DIR}/foo.txt" fsanitize-blacklist)
+               CHECK_C_COMPILER_FLAG ("-fsanitize-address-use-after-scope" fsanitize-address-use-after-scope)
+               unset(CMAKE_REQUIRED_FLAGS)
+
                if(fsanitize-address)
-                       if(${CMAKE_C_COMPILER_ID} STREQUAL "Clang")
-                               set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize-blacklist=${CMAKE_SOURCE_DIR}/scripts/blacklist-address-sanitizer.txt")
-                       endif()
-                       set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address -fsanitize-address-use-after-scope")
+                       set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address")
                        set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -fsanitize=address")
                        set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=address")
-               else()
-                       message(FATAL_ERROR "Missing support for address sanitizer!")
-               endif()
-               if (DEFINED SAVE_CMAKE_REQUIRED_FLAGS)
-                       set(CMAKE_REQUIRED_FLAGS ${SAVE_CMAKE_REQUIRED_FLAGS})
-               else()
-                       unset(CMAKE_REQUIRED_FLAGS)
-               endif()
 
-               CHECK_C_COMPILER_FLAG ("-fno-omit-frame-pointer" fno-omit-frame-pointer)
+                       if(fsanitize-blacklist)
+                               set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize-blacklist=${CMAKE_SOURCE_DIR}/scripts/blacklist-address-sanitizer.txt")
+                       endif(fsanitize-blacklist)
+
+                       if(fsanitize-address-use-after-scope)
+                               set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize-address-use-after-scope")
+                       endif(fsanitize-address-use-after-scope)
+
+               else(fsanitize-address)
+            message(WARNING "Missing support for address sanitizer!")
+               endif(fsanitize-address)
+
                if(fno-omit-frame-pointer)
                        set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-omit-frame-pointer")
                endif()
        elseif(WITH_SANITIZE_MEMORY)
-               if (DEFINED CMAKE_REQUIRED_FLAGS)
-                       set(SAVE_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
-               endif()
                set(CMAKE_REQUIRED_FLAGS "-fsanitize=memory")
                CHECK_C_COMPILER_FLAG ("-fsanitize=memory" fsanitize-memory)
+               CHECK_C_COMPILER_FLAG ("-fsanitize-blacklist=${CMAKE_BINARY_DIR}/foo.txt" fsanitize-blacklist)
+               CHECK_C_COMPILER_FLAG ("-fsanitize-memory-use-after-dtor" fsanitize-memory-use-after-dtor)
+               CHECK_C_COMPILER_FLAG ("-fsanitize-memory-track-origins" fsanitize-memory-track-origins)
+               unset(CMAKE_REQUIRED_FLAGS)
+
                if(fsanitize-memory)
-                       if(${CMAKE_C_COMPILER_ID} STREQUAL "Clang")
-                               set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize-blacklist=${CMAKE_SOURCE_DIR}/scripts/blacklist-memory-sanitizer.txt")
-                       endif()
-                       set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=memory -fsanitize-memory-track-origins -fsanitize-memory-use-after-dtor")
+                       set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=memory")
                        set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -fsanitize=memory")
                        set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=memory")
-               else()
-                       message(FATAL_ERROR "Missing support for memory sanitizer!")
-               endif()
-               if (DEFINED SAVE_CMAKE_REQUIRED_FLAGS)
-                       set(CMAKE_REQUIRED_FLAGS ${SAVE_CMAKE_REQUIRED_FLAGS})
-               else()
-                       unset(CMAKE_REQUIRED_FLAGS)
-               endif()
 
-               CHECK_C_COMPILER_FLAG ("-fno-omit-frame-pointer" fno-omit-frame-pointer)
+                       if(fsanitize-blacklist)
+                               set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize-blacklist=${CMAKE_SOURCE_DIR}/scripts/blacklist-memory-sanitizer.txt")
+                       endif(fsanitize-blacklist)
+
+                       if (fsanitize-memory-use-after-dtor)
+                               set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize-memory-use-after-dtor")
+                       endif(fsanitize-memory-use-after-dtor)
+
+                       if (fsanitize-memory-track-origins)
+                               set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize-memory-track-origins")
+                       endif(fsanitize-memory-track-origins)
+
+               else(fsanitize-memory)
+            message(WARNING "Missing support for memory sanitizer!")
+               endif(fsanitize-memory)
+
                if(fno-omit-frame-pointer)
                        set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-omit-frame-pointer")
                endif()
        elseif(WITH_SANITIZE_THREAD)
-               if (DEFINED CMAKE_REQUIRED_FLAGS)
-                       set(SAVE_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
-               endif()
-               set(CMAKE_REQUIRED_FLAGS "-fsanitize=thread")
                CHECK_C_COMPILER_FLAG ("-fsanitize=thread" fsanitize-thread)
+               CHECK_C_COMPILER_FLAG ("-fsanitize-blacklist=${CMAKE_BINARY_DIR}/foo.txt" fsanitize-blacklist)
+               unset(CMAKE_REQUIRED_FLAGS)
                if(fsanitize-thread)
-                       if(${CMAKE_C_COMPILER_ID} STREQUAL "Clang")
-                               set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize-blacklist=${CMAKE_SOURCE_DIR}/scripts/blacklist-thread-sanitizer.txt")
-                       endif()
+                       set(CMAKE_REQUIRED_FLAGS "-Werror -fsanitize=thread")
                        set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=thread")
+                       if(fsanitize-blacklist)
+                               set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize-blacklist=${CMAKE_SOURCE_DIR}/scripts/blacklist-thread-sanitizer.txt")
+                       endif(fsanitize-blacklist)
                        set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -fsanitize=thread")
                        set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=thread")
-               else()
-                       message(FATAL_ERROR "Missing support for thread sanitizer!")
-               endif()
-               if (DEFINED SAVE_CMAKE_REQUIRED_FLAGS)
-                       set(CMAKE_REQUIRED_FLAGS ${SAVE_CMAKE_REQUIRED_FLAGS})
-               else()
-                       unset(CMAKE_REQUIRED_FLAGS)
-               endif()
+               else(fsanitize-thread)
+            message(WARNING "Missing support for thread sanitizer!")
+               endif(fsanitize-thread)
 
-               CHECK_C_COMPILER_FLAG ("-fno-omit-frame-pointer" fno-omit-frame-pointer)
                if(fno-omit-frame-pointer)
                        set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-omit-frame-pointer")
                endif()
        endif()
 
+       file(REMOVE ${CMAKE_BINARY_DIR}/foo.txt)
+
        if (WITH_NO_UNDEFINED)
-               if (DEFINED CMAKE_REQUIRED_FLAGS)
-                       set(SAVE_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
-               endif()
                set(CMAKE_REQUIRED_FLAGS "-Wl,--no-undefined")
                CHECK_C_COMPILER_FLAG (-Wl,--no-undefined no-undefined)
-               if (DEFINED SAVE_CMAKE_REQUIRED_FLAGS)
-                       set(CMAKE_REQUIRED_FLAGS ${SAVE_CMAKE_REQUIRED_FLAGS})
-                       unset(SAVE_CMAKE_REQUIRED_FLAGS)
-               else()
-                       unset(CMAKE_REQUIRED_FLAGS)
-               endif()
+               unset(CMAKE_REQUIRED_FLAGS)
+
                if(no-undefined)
                        SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--no-undefined" )
                endif()
        endif()
+
+       set(CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS_SAVED})
 endif()
 
 if(MSVC)
@@ -850,7 +852,7 @@ find_feature(GSSAPI ${GSSAPI_FEATURE_TYPE} ${GSSAPI_FEATURE_PURPOSE} ${GSSAPI_FE
 if ( (WITH_GSSAPI) AND (NOT GSS_FOUND))
        message(WARNING "-DWITH_GSSAPI=ON is set, but not GSSAPI implementation was found, disabling")
 elseif(WITH_GSSAPI)
-       if(GSS_FLAVOUR STREQUAL "MIT") 
+       if(GSS_FLAVOUR STREQUAL "MIT")
                add_definitions("-DWITH_GSSAPI -DWITH_GSSAPI_MIT")
                if(GSS_VERSION_1_13)
                        add_definitions("-DHAVE_AT_LEAST_KRB_V1_13")