]> git.ipfire.org Git - thirdparty/zlib-ng.git/commitdiff
Harden sanitizer support
authorPaul Marquess <pmqs@outlook.com>
Sun, 15 Feb 2026 16:18:59 +0000 (16:18 +0000)
committerHans Kristian Rosbach <hk-github@circlestorm.org>
Mon, 9 Mar 2026 19:43:54 +0000 (20:43 +0100)
CMakeLists.txt
cmake/detect-sanitizer.cmake
test/CMakeLists.txt

index 84b64e9a3b12e92460cfdeb7b158ab3636a43df0..550ddcde031fd3ab79be2ada448847e29f931a98 100644 (file)
@@ -39,6 +39,7 @@ include(CheckIncludeFile)
 include(CheckCSourceCompiles)
 include(CheckCSourceRuns)
 include(CheckCCompilerFlag)
+include(CheckLinkerFlag)
 include(CMakeDependentOption)
 include(CMakePackageConfigHelpers)
 include(CTest)
@@ -111,7 +112,7 @@ Default is no prefix (empty prefix).")
 
 # Add multi-choice option
 set(WITH_SANITIZER OFF CACHE STRING "Enable sanitizer support")
-set_property(CACHE WITH_SANITIZER PROPERTY STRINGS "OFF" "Memory" "Address" "Undefined" "Thread")
+set_property(CACHE WITH_SANITIZER PROPERTY STRINGS "OFF" "memory" "address" "undefined" "thread")
 
 if(BASEARCH_ARM_FOUND)
     cmake_dependent_option(WITH_ARMV6 "Build with ARMv6 SIMD" ON ARCH_32BIT OFF)
@@ -563,14 +564,22 @@ set(CMAKE_REQUIRED_DEFINITIONS)
 #
 # Check whether a sanitizer was requested
 #
-if(WITH_SANITIZER STREQUAL "Address")
+message(STATUS "Checking for sanitizer option")
+
+string(TOLOWER "${WITH_SANITIZER}" WITH_SANITIZER)
+if(NOT WITH_SANITIZER)
+    message(STATUS " sanitizer not enabled")
+elseif(WITH_SANITIZER STREQUAL "address")
     add_address_sanitizer()
-elseif(WITH_SANITIZER STREQUAL "Memory")
+elseif(WITH_SANITIZER STREQUAL "memory")
     add_memory_sanitizer()
-elseif(WITH_SANITIZER STREQUAL "Thread")
+elseif(WITH_SANITIZER STREQUAL "thread")
     add_thread_sanitizer()
-elseif(WITH_SANITIZER STREQUAL "Undefined")
+elseif(WITH_SANITIZER STREQUAL "undefined")
     add_undefined_sanitizer()
+else()
+    message(FATAL_ERROR "Unknown WITH_SANITIZER option: '${WITH_SANITIZER}'\n"
+                    "WITH_SANITIZER must be one of: 'memory', 'address', 'undefined', 'thread'")
 endif()
 
 #
index ebf9674b3da0e96b21601c6e64d161f2c5e8769b..c7c33ff38d858753f9f429a3b4aaca6d84163c24 100644 (file)
@@ -55,11 +55,16 @@ macro(add_address_sanitizer)
     check_sanitizer_support("${known_checks}" supported_checks)
     if(NOT ${supported_checks} STREQUAL "")
         message(STATUS "Address sanitizer is enabled: ${supported_checks}")
-        add_compile_options(-fsanitize=${supported_checks})
-        add_link_options(-fsanitize=${supported_checks})
+        if(NOT MSVC)
+            add_compile_options("-fsanitize=${supported_checks}")
+            add_link_options("-fsanitize=${supported_checks}")
+        else()
+            add_compile_options("/fsanitize=${supported_checks}" "/Zi")
+            # Note that the MSVC linker doesn't use /fsanitizer
+        endif()
         add_common_sanitizer_flags()
     else()
-        message(STATUS "Address sanitizer is not supported")
+        message(FATAL_ERROR "Address sanitizer is not supported")
     endif()
 
     if(CMAKE_CROSSCOMPILING_EMULATOR)
@@ -74,6 +79,8 @@ macro(add_address_sanitizer)
             add_link_options(-fsanitize=${supported_checks})
             add_common_sanitizer_flags()
         else()
+            # The Microsoft C compiler doesn't support Leak detector,
+            # so don't make this an error that disables ASAN completely
             message(STATUS "Leak sanitizer is not supported")
         endif()
     endif()
@@ -93,7 +100,7 @@ macro(add_memory_sanitizer)
             add_link_options(-fsanitize-memory-track-origins)
         endif()
     else()
-        message(STATUS "Memory sanitizer is not supported")
+        message(FATAL_ERROR "Memory sanitizer is not supported")
     endif()
 endmacro()
 
@@ -105,7 +112,7 @@ macro(add_thread_sanitizer)
         add_link_options(-fsanitize=${supported_checks})
         add_common_sanitizer_flags()
     else()
-        message(STATUS "Thread sanitizer is not supported")
+        message(FATAL_ERROR "Thread sanitizer is not supported")
     endif()
 endmacro()
 
@@ -152,6 +159,6 @@ macro(add_undefined_sanitizer)
 
         add_common_sanitizer_flags()
     else()
-        message(STATUS "Undefined behavior sanitizer is not supported")
+        message(FATAL_ERROR "Undefined behavior sanitizer is not supported")
     endif()
-endmacro()
+endmacro()
\ No newline at end of file
index 37c649d65d4c36f4bd9e38722034f4061cfe8766..2e156c4aa418521e1e5ae58f93e8b06176dee019 100644 (file)
@@ -103,7 +103,7 @@ if(WITH_GTEST)
     endif()
 
     # Google test requires MSAN instrumented LLVM C++ libraries
-    if(WITH_SANITIZER STREQUAL "Memory")
+    if(WITH_SANITIZER STREQUAL "memory")
         if(NOT DEFINED ENV{LLVM_BUILD_DIR})
             message(FATAL_ERROR "MSAN instrumented C++ libraries required!")
         endif()
@@ -202,7 +202,7 @@ if(WITH_GTEST)
             target_compile_options(gtest_zlib PRIVATE -D_XOPEN_SOURCE=700)
         endif()
 
-        if(WITH_SANITIZER STREQUAL "Memory")
+        if(WITH_SANITIZER STREQUAL "memory")
             target_link_directories(gtest_zlib PRIVATE $ENV{LLVM_BUILD_DIR}/lib)
             target_link_options(gtest_zlib PRIVATE
                 -stdlib=libc++