Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 7 additions & 6 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -25,12 +25,13 @@ jobs:
cmake-args: -D MZ_SANITIZER=Undefined
codecov: ubuntu_gcc_undefined

- name: Ubuntu GCC MSAN
os: ubuntu-latest
compiler: gcc
cxx-compiler: g++
cmake-args: -D MZ_SANITIZER=Memory
codecov: ubuntu_gcc_msan
# Memory Sanitizer not currenly supported on GitHub
# - name: Ubuntu GCC MSAN
# os: ubuntu-latest
# compiler: gcc
# cxx-compiler: g++
# cmake-args: -D MZ_SANITIZER=Memory
# codecov: ubuntu_gcc_msan

# No code coverage on release builds
- name: Ubuntu 22 Clang
Expand Down
39 changes: 29 additions & 10 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -73,8 +73,9 @@ option(MZ_BUILD_UNIT_TESTS "Builds minizip unit test project" OFF)
option(MZ_BUILD_FUZZ_TESTS "Builds minizip fuzzer executables" OFF)
option(MZ_CODE_COVERAGE "Builds with code coverage flags" OFF)
# Multi-choice code sanitizer option
set(MZ_SANITIZER AUTO CACHE STRING "Enable sanitizer support")
set_property(CACHE MZ_SANITIZER PROPERTY STRINGS "Memory" "Address" "Undefined" "Thread")
set(MZ_SANITIZER_FLAVORS "memory" "address" "undefined" "thread")
set(MZ_SANITIZER "none" CACHE STRING "Enable Sanitizer support")
set_property(CACHE MZ_SANITIZER PROPERTY STRINGS "${MZ_SANITIZER_FLAVORS}")

# Backwards compatibility
if(DEFINED MZ_BUILD_TEST)
Expand Down Expand Up @@ -691,14 +692,31 @@ if(MZ_COMPAT)
endif()

# Detect available sanitizers
if(MZ_SANITIZER STREQUAL "Address")
add_address_sanitizer()
elseif(MZ_SANITIZER STREQUAL "Memory")
add_memory_sanitizer()
elseif(MZ_SANITIZER STREQUAL "Thread")
add_thread_sanitizer()
elseif(MZ_SANITIZER STREQUAL "Undefined")
add_undefined_sanitizer()
message(STATUS "Checking for Address Sanitizer Option")

string(TOLOWER "${MZ_SANITIZER}" MZ_SANITIZER_LOWER)
if(MZ_SANITIZER_LOWER IN_LIST MZ_SANITIZER_FLAVORS)
set(MZ_SANITIZER_ENABLED ON)

if(MZ_SANITIZER_LOWER STREQUAL "address")
add_address_sanitizer("MZ_STATUS")
elseif(MZ_SANITIZER_LOWER STREQUAL "memory")
add_memory_sanitizer("MZ_STATUS")
elseif(MZ_SANITIZER_LOWER STREQUAL "thread")
add_thread_sanitizer("MZ_STATUS")
elseif(MZ_SANITIZER_LOWER STREQUAL "undefined")
add_undefined_sanitizer("MZ_STATUS")
endif()
if(NOT MZ_STATUS)
set(MZ_SANITIZER_ENABLED OFF)
message(FATAL_ERROR "Cannot enable Sanitizer")
endif()
elseif(MZ_SANITIZER_LOWER STREQUAL "none")
set(MZ_SANITIZER_ENABLED OFF)
message(STATUS " Sanitizer not enabled")
else()
message(FATAL_ERROR "Unknown MZ_SANITIZER option: '${MZ_SANITIZER}'\n"
"MZ_SANITIZER must be one of '${MZ_SANITIZER_FLAVORS}'")
endif()

# Set compiler options
Expand Down Expand Up @@ -1083,5 +1101,6 @@ add_feature_info(MZ_BUILD_TESTS MZ_BUILD_TESTS "Builds minizip test executable")
add_feature_info(MZ_BUILD_UNIT_TESTS MZ_BUILD_UNIT_TESTS "Builds minizip unit test project")
add_feature_info(MZ_BUILD_FUZZ_TESTS MZ_BUILD_FUZZ_TESTS "Builds minizip fuzzer executables")
add_feature_info(MZ_CODE_COVERAGE MZ_CODE_COVERAGE "Builds with code coverage flags")
add_feature_info(MZ_SANITIZER MZ_SANITIZER_ENABLED "Builds with Sanitizer Support")

feature_summary(WHAT ENABLED_FEATURES DISABLED_FEATURES INCLUDE_QUIET_PACKAGES)
18 changes: 14 additions & 4 deletions cmake/detect-sanitizer.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -45,13 +45,14 @@ macro(check_sanitizer_support known_checks supported_checks)
set(${supported_checks} ${available_checks})
endmacro()

macro(add_address_sanitizer)
macro(add_address_sanitizer return_status)
set(known_checks
address
pointer-compare
pointer-subtract
)

set(${return_status} 1)
check_sanitizer_support("${known_checks}" supported_checks)
if(NOT ${supported_checks} STREQUAL "")
message(STATUS "Address sanitizer is enabled: ${supported_checks}")
Expand All @@ -60,11 +61,13 @@ macro(add_address_sanitizer)
add_common_sanitizer_flags()
else()
message(STATUS "Address sanitizer is not supported")
set(${return_status} 0)
endif()

if(CMAKE_CROSSCOMPILING_EMULATOR)
# Only check for leak sanitizer if not cross-compiling due to qemu crash
message(WARNING "Leak sanitizer is not supported when cross compiling")
set(${return_status} 0)
else()
# Leak sanitizer requires address sanitizer
check_sanitizer_support("leak" supported_checks)
Expand All @@ -75,11 +78,13 @@ macro(add_address_sanitizer)
add_common_sanitizer_flags()
else()
message(STATUS "Leak sanitizer is not supported")
set(${return_status} 0)
endif()
endif()
endmacro()

macro(add_memory_sanitizer)
macro(add_memory_sanitizer return_status)
set(${return_status} 1)
check_sanitizer_support("memory" supported_checks)
if(NOT ${supported_checks} STREQUAL "")
message(STATUS "Memory sanitizer is enabled: ${supported_checks}")
Expand All @@ -94,10 +99,12 @@ macro(add_memory_sanitizer)
endif()
else()
message(STATUS "Memory sanitizer is not supported")
set(${return_status} 0)
endif()
endmacro()

macro(add_thread_sanitizer)
macro(add_thread_sanitizer return_status)
set(${return_status} 1)
check_sanitizer_support("thread" supported_checks)
if(NOT ${supported_checks} STREQUAL "")
message(STATUS "Thread sanitizer is enabled: ${supported_checks}")
Expand All @@ -106,10 +113,11 @@ macro(add_thread_sanitizer)
add_common_sanitizer_flags()
else()
message(STATUS "Thread sanitizer is not supported")
set(${return_status} 0)
endif()
endmacro()

macro(add_undefined_sanitizer)
macro(add_undefined_sanitizer return_status)
set(known_checks
array-bounds
bool
Expand Down Expand Up @@ -137,6 +145,7 @@ macro(add_undefined_sanitizer)
vptr
)

set(${return_status} 1)
# Only check for alignment sanitizer flag if unaligned access is not supported
if(NOT WITH_UNALIGNED)
list(APPEND known_checks alignment)
Expand All @@ -162,5 +171,6 @@ macro(add_undefined_sanitizer)
add_common_sanitizer_flags()
else()
message(STATUS "Undefined behavior sanitizer is not supported")
set(${return_status} 0)
endif()
endmacro()
Loading