From 6082dba35643b8063ee920f83e557c79bc74097a Mon Sep 17 00:00:00 2001 From: Richard Biely Date: Sun, 20 Oct 2024 10:07:47 +0200 Subject: [PATCH] Changed: USE_SANITIZER -> GAIA_USE_SANITIZER Fixed: Sanitizer handling in code --- README.md | 4 ++-- cmake/sanitizers.cmake | 24 ++++++++++++------------ docker/build_clang.sh | 8 ++++---- gaia.code-workspace | 1 + include/gaia/mem/mem_sani.h | 11 +++++++---- single_include/gaia.h | 9 +++++++-- src/CMakeLists.txt | 6 ++++++ 7 files changed, 39 insertions(+), 24 deletions(-) diff --git a/README.md b/README.md index f7880090..8c2c01ab 100644 --- a/README.md +++ b/README.md @@ -1856,13 +1856,13 @@ Parameter | Description **GAIA_PROFILER_CPU** | Enables CPU [profiling](#profiling) features **GAIA_PROFILER_MEM** | Enabled memory [profiling](#profiling) features **GAIA_PROFILER_BUILD** | Builds the [profiler](#profiling) ([Tracy](https://github.com/wolfpld/tracy) by default) -**USE_SANITIZER** | Applies the specified set of [sanitizers](#sanitizers) +**GAIA_USE_SANITIZER** | Applies the specified set of [sanitizers](#sanitizers) ### Sanitizers Possible options are listed in [cmake/sanitizers.cmake](https://github.com/richardbiely/gaia-ecs/blob/main/cmake/sanitizers.cmake).
Note, that some options don't work together or might not be supported by all compilers. ```bash -cmake -DCMAKE_BUILD_TYPE=Release -DUSE_SANITIZER=address -S . -B "build" +cmake -DCMAKE_BUILD_TYPE=Release -DGAIA_USE_SANITIZER=address -S . -B "build" ``` ### Single-header diff --git a/cmake/sanitizers.cmake b/cmake/sanitizers.cmake index ee97bf9c..0d49ef8c 100644 --- a/cmake/sanitizers.cmake +++ b/cmake/sanitizers.cmake @@ -15,7 +15,7 @@ include(CheckCXXSourceCompiles) -set(USE_SANITIZER +set(GAIA_USE_SANITIZER "" CACHE STRING @@ -41,7 +41,7 @@ function(test_san_flags return_var flags) set(CMAKE_REQUIRED_QUIET "${QUIET_BACKUP}") endfunction() -if(USE_SANITIZER) +if(GAIA_USE_SANITIZER) append("-fno-omit-frame-pointer" CMAKE_C_FLAGS CMAKE_CXX_FLAGS) unset(SANITIZER_SELECTED_FLAGS) @@ -51,7 +51,7 @@ if(USE_SANITIZER) append("-O1" CMAKE_C_FLAGS CMAKE_CXX_FLAGS) endif() - if(USE_SANITIZER MATCHES "([Aa]ddress)") + if(GAIA_USE_SANITIZER MATCHES "([Aa]ddress)") # Optional: -fno-optimize-sibling-calls -fsanitize-address-use-after-scope message(STATUS "Testing with Address sanitizer") set(SANITIZER_ADDR_FLAG "-fsanitize=address") @@ -83,11 +83,11 @@ if(USE_SANITIZER) endif() endif() - if(USE_SANITIZER MATCHES "([Mm]emory([Ww]ith[Oo]rigins)?)") + if(GAIA_USE_SANITIZER MATCHES "([Mm]emory([Ww]ith[Oo]rigins)?)") # Optional: -fno-optimize-sibling-calls -fsanitize-memory-track-origins=2 set(SANITIZER_MEM_FLAG "-fsanitize=memory") - if(USE_SANITIZER MATCHES "([Mm]emory[Ww]ith[Oo]rigins)") + if(GAIA_USE_SANITIZER MATCHES "([Mm]emory[Ww]ith[Oo]rigins)") message(STATUS "Testing with MemoryWithOrigins sanitizer") append("-fsanitize-memory-track-origins" SANITIZER_MEM_FLAG) else() @@ -97,7 +97,7 @@ if(USE_SANITIZER) test_san_flags(SANITIZER_MEM_AVAILABLE ${SANITIZER_MEM_FLAG}) if(SANITIZER_MEM_AVAILABLE) - if(USE_SANITIZER MATCHES "([Mm]emory[Ww]ith[Oo]rigins)") + if(GAIA_USE_SANITIZER MATCHES "([Mm]emory[Ww]ith[Oo]rigins)") message(STATUS " Building with MemoryWithOrigins sanitizer") else() message(STATUS " Building with Memory sanitizer") @@ -109,7 +109,7 @@ if(USE_SANITIZER) endif() endif() - if(USE_SANITIZER MATCHES "([Uu]ndefined)") + if(GAIA_USE_SANITIZER MATCHES "([Uu]ndefined)") message(STATUS "Testing with Undefined Behaviour sanitizer") set(SANITIZER_UB_FLAG "-fsanitize=undefined") @@ -127,7 +127,7 @@ if(USE_SANITIZER) endif() endif() - if(USE_SANITIZER MATCHES "([Tt]hread)") + if(GAIA_USE_SANITIZER MATCHES "([Tt]hread)") message(STATUS "Testing with Thread sanitizer") set(SANITIZER_THREAD_FLAG "-fsanitize=thread") test_san_flags(SANITIZER_THREAD_AVAILABLE ${SANITIZER_THREAD_FLAG}) @@ -140,7 +140,7 @@ if(USE_SANITIZER) endif() endif() - if(USE_SANITIZER MATCHES "([Ll]eak)") + if(GAIA_USE_SANITIZER MATCHES "([Ll]eak)") message(STATUS "Testing with Leak sanitizer") set(SANITIZER_LEAK_FLAG "-fsanitize=leak") test_san_flags(SANITIZER_LEAK_AVAILABLE ${SANITIZER_LEAK_FLAG}) @@ -163,16 +163,16 @@ if(USE_SANITIZER) message(FATAL_ERROR " Sanitizer flags ${SANITIZER_SELECTED_FLAGS} are not compatible.") endif() elseif(MSVC) - if(USE_SANITIZER MATCHES "([Aa]ddress)") + if(GAIA_USE_SANITIZER MATCHES "([Aa]ddress)") message(STATUS "Building with Address sanitizer") append("-fsanitize=address" CMAKE_C_FLAGS CMAKE_CXX_FLAGS) else() message( FATAL_ERROR - "This sanitizer not yet supported in the MSVC environment: ${USE_SANITIZER}" + "This sanitizer not yet supported in the MSVC environment: ${GAIA_USE_SANITIZER}" ) endif() else() - message(FATAL_ERROR "USE_SANITIZER is not supported on this platform.") + message(FATAL_ERROR "GAIA_USE_SANITIZER is not supported on this platform.") endif() endif() \ No newline at end of file diff --git a/docker/build_clang.sh b/docker/build_clang.sh index 27664de8..130b1653 100755 --- a/docker/build_clang.sh +++ b/docker/build_clang.sh @@ -82,7 +82,7 @@ fi # Debug mode - address sanitizers cmake -E make_directory ${PATH_DEBUG_ADDR} -cmake -DCMAKE_BUILD_TYPE=Debug ${BUILD_SETTINGS_COMMON_SANI} -DUSE_SANITIZER=${SANI_ADDR} -S .. -B ${PATH_DEBUG_ADDR} +cmake -DCMAKE_BUILD_TYPE=Debug ${BUILD_SETTINGS_COMMON_SANI} -DGAIA_USE_SANITIZER=${SANI_ADDR} -S .. -B ${PATH_DEBUG_ADDR} if ! cmake --build ${PATH_DEBUG_ADDR} --config Debug; then echo "${PATH_DEBUG_ADDR} build failed" exit 1 @@ -90,7 +90,7 @@ fi # Debug mode - memory sanitizers cmake -E make_directory ${PATH_DEBUG_MEM} -cmake -DCMAKE_BUILD_TYPE=Debug ${BUILD_SETTINGS_COMMON_SANI} -DUSE_SANITIZER=${SANI_MEM} -S .. -B ${PATH_DEBUG_MEM} +cmake -DCMAKE_BUILD_TYPE=Debug ${BUILD_SETTINGS_COMMON_SANI} -DGAIA_USE_SANITIZER=${SANI_MEM} -S .. -B ${PATH_DEBUG_MEM} if ! cmake --build ${PATH_DEBUG_MEM} --config Debug; then echo "${PATH_DEBUG_MEM} build failed" exit 1 @@ -98,7 +98,7 @@ fi # Release mode - address sanitizers cmake -E make_directory ${PATH_RELEASE_ADDR} -cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo ${BUILD_SETTINGS_COMMON_SANI} -DUSE_SANITIZER=${SANI_ADDR} -S .. -B ${PATH_RELEASE_ADDR} +cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo ${BUILD_SETTINGS_COMMON_SANI} -DGAIA_USE_SANITIZER=${SANI_ADDR} -S .. -B ${PATH_RELEASE_ADDR} if ! cmake --build ${PATH_RELEASE_ADDR} --config RelWithDebInfo; then echo "${PATH_RELEASE_ADDR} build failed" exit 1 @@ -106,7 +106,7 @@ fi # Release mode - memory sanitizers cmake -E make_directory ${PATH_RELEASE_MEM} -cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo ${BUILD_SETTINGS_COMMON_SANI} -DUSE_SANITIZER=${SANI_MEM} -S .. -B ${PATH_RELEASE_MEM} +cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo ${BUILD_SETTINGS_COMMON_SANI} -DGAIA_USE_SANITIZER=${SANI_MEM} -S .. -B ${PATH_RELEASE_MEM} if ! cmake --build ${PATH_RELEASE_MEM} --config RelWithDebInfo; then echo "${PATH_RELEASE_MEM} build failed" exit 1 diff --git a/gaia.code-workspace b/gaia.code-workspace index 62ada8cf..4a979144 100644 --- a/gaia.code-workspace +++ b/gaia.code-workspace @@ -123,6 +123,7 @@ "picobench", "prefetchnta", "Reimplementation", + "SANI", "SIMD", "subviews", "Unpoison", diff --git a/include/gaia/mem/mem_sani.h b/include/gaia/mem/mem_sani.h index b5a242ff..341817b0 100644 --- a/include/gaia/mem/mem_sani.h +++ b/include/gaia/mem/mem_sani.h @@ -1,16 +1,19 @@ #pragma once -#include "../config/config_core.h" - #ifndef GAIA_USE_MEM_SANI #if defined(__has_feature) - #if __has_feature(address_sanitizer) || defined(USE_SANITIZER) || defined(_SANITIZE_ADDRESS__) + #if __has_feature(address_sanitizer) + #define GAIA_HAS_SANI_FEATURE 1 + #else + #define GAIA_HAS_SANI_FEATURE 0 + #endif + #if GAIA_HAS_SANI_FEATURE || GAIA_USE_SANITIZER || defined(__SANITIZE_ADDRESS__) #define GAIA_USE_MEM_SANI 1 #else #define GAIA_USE_MEM_SANI 0 #endif #else - #if defined(USE_SANITIZER) || defined(_SANITIZE_ADDRESS__) + #if GAIA_USE_SANITIZER || defined(__SANITIZE_ADDRESS__) #define GAIA_USE_MEM_SANI 1 #else #define GAIA_USE_MEM_SANI 0 diff --git a/single_include/gaia.h b/single_include/gaia.h index c70cea37..56fef72c 100644 --- a/single_include/gaia.h +++ b/single_include/gaia.h @@ -4619,13 +4619,18 @@ namespace gaia { #ifndef GAIA_USE_MEM_SANI #if defined(__has_feature) - #if __has_feature(address_sanitizer) || defined(USE_SANITIZER) || defined(_SANITIZE_ADDRESS__) + #if __has_feature(address_sanitizer) + #define GAIA_HAS_SANI_FEATURE 1 + #else + #define GAIA_HAS_SANI_FEATURE 0 + #endif + #if GAIA_HAS_SANI_FEATURE || GAIA_USE_SANITIZER || defined(__SANITIZE_ADDRESS__) #define GAIA_USE_MEM_SANI 1 #else #define GAIA_USE_MEM_SANI 0 #endif #else - #if defined(USE_SANITIZER) || defined(_SANITIZE_ADDRESS__) + #if GAIA_USE_SANITIZER || defined(__SANITIZE_ADDRESS__) #define GAIA_USE_MEM_SANI 1 #else #define GAIA_USE_MEM_SANI 0 diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index e93fef53..919c13fa 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -227,6 +227,12 @@ else() enable_cxx_compiler_flag_if_supported("-fno-exceptions") endif() +if(NOT "GAIA_USE_SANITIZER" MATCHES "") + add_definitions(-DGAIA_USE_SANITIZER=1) +else() + add_definitions(-DGAIA_USE_SANITIZER=0) +endif() + set(IS_FETCH_AVAILABLE OFF) if(GAIA_BUILD_BENCHMARK OR GAIA_BUILD_UNITTEST OR GAIA_PROFILER_CPU OR GAIA_PROFILER_MEM OR GAIA_MAKE_SINGLE_HEADER)