db41258d16
Ersetzt das Geruest (counter/notebook) durch ein echtes Beispiel und teilt es in zwei eigenstaendige Projekte, wie P1204R0 es fuer Bibliothek plus Programm verlangt. libpda: textfile (C, Datei-I/O und Feld-Escaping), calculator (Recursive-Descent-Parser mit std::expected), contact, editor, explorer. Exportiert pda::pda ueber install(EXPORT) und ist per find_package(pda) benutzbar. pda: Shell ohne Ein-/Ausgabe (execute() gibt Text zurueck, deshalb ohne Terminal testbar), REPL und Stapelbetrieb in main.cpp. examples/consumer und tools/check-install.sh pruefen die Export-Kette Ende-zu-Ende: installieren, dann ein fremdes Projekt dagegen bauen. docs/CMAKE.md erklaert das Target-Modell, PUBLIC/PRIVATE/INTERFACE, Generator-Ausdruecke, install/export und Symbolsichtbarkeit an diesem Projekt. 71 Tests gruen unter Homebrew-clang 22, Apple clang und GCC 16, statisch und shared, mit und ohne ASan/UBSan. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
44 lines
1.6 KiB
CMake
44 lines
1.6 KiB
CMake
# ---------------------------------------------------------------------------
|
|
# 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()
|