Files
playground/cmake/Sanitizers.cmake
T
paulhorn da43859b97 feat: Projektstruktur nach P1204R0
Layout, Build und Konventionen analog zu mydb und cxx_scaffold_cli:
Header und Quellen nebeneinander in playground/, Unit-Tests als
.test.c/.test.cpp daneben, Integrationstests in tests/.

Geruest-Module counter (C, Unity) und notebook (C++, doctest) zeigen
jede Regel einmal an lauffaehigem Code.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-30 16:07:03 +02:00

42 lines
1.6 KiB
CMake

# ---------------------------------------------------------------------------
# Sanitizers, ueber -DPLAYGROUND_SANITIZE=address,undefined aktiviert
# (das asan-ubsan-Preset setzt genau das).
#
# Warum das gerade hier zaehlt: in einem Playground steht oft genau der Code,
# den man noch nicht versteht -- rohe Puffer, Pointer-Arithmetik, fremde APIs.
# Ein Off-by-one beschaedigt stillschweigend Nachbardaten; ein selbstgebauter
# assert-Test sieht das nie, ASan sofort.
# ---------------------------------------------------------------------------
set(PLAYGROUND_SANITIZE "" CACHE STRING
"Komma-getrennte Sanitizer-Liste, z.B. address,undefined")
if(NOT PLAYGROUND_SANITIZE STREQUAL "")
if(NOT (CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang|AppleClang"))
message(WARNING "PLAYGROUND_SANITIZE wird von ${CMAKE_CXX_COMPILER_ID} nicht unterstuetzt")
return()
endif()
set(_flags
-fsanitize=${PLAYGROUND_SANITIZE}
# Ohne Frame-Pointer sind die ASan-Stacks unbrauchbar.
-fno-omit-frame-pointer
# Inlining verschluckt sonst die Zeilennummer, in der der Fehler steckt.
-fno-optimize-sibling-calls
)
if(PLAYGROUND_SANITIZE MATCHES "undefined")
# Entscheidend: ohne das MELDET UBSan den Fehler nur und laeuft weiter,
# der Test wird gruen und die Meldung verschwindet im Scrollback.
# So schlaegt der Test tatsaechlich fehl.
list(APPEND _flags -fno-sanitize-recover=undefined)
endif()
add_compile_options(${_flags})
add_link_options(-fsanitize=${PLAYGROUND_SANITIZE})
message(STATUS "Sanitizers: ${PLAYGROUND_SANITIZE}")
endif()