# --------------------------------------------------------------------------- # Sanitizers, ueber -DPDA_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. # --------------------------------------------------------------------------- include_guard(GLOBAL) set(PDA_SANITIZE "" CACHE STRING "Komma-getrennte Sanitizer-Liste, z.B. address,undefined") if(NOT PDA_SANITIZE STREQUAL "") if(NOT (CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang|AppleClang")) message(WARNING "PDA_SANITIZE wird von ${CMAKE_CXX_COMPILER_ID} nicht unterstuetzt") return() endif() set(_flags -fsanitize=${PDA_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(PDA_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=${PDA_SANITIZE}) message(STATUS "Sanitizers: ${PDA_SANITIZE}") endif()