ci: ThreadSanitizer lane + fix use-after-free TSan flagged
Adds a -DSECSGEM_TSAN=ON CMake option that builds every target with -fsanitize=thread + debug symbols + -O1 + frame pointers. Wires a dedicated thread-sanitizer job into .gitea/workflows/ci.yml that builds and runs the full test suite under TSan with TSAN_OPTIONS=halt_on_error=1 (any flagged race fails the job, not just warns). Result against the full 426-case / 2557-assertion suite: 0 warnings, all green. That converts the existing test_thread_safety.cpp (which exercised the asio::post-onto-strand pattern) and test_concurrency (in-flight transaction interleaving) and test_robustness_fuzz (28 random action types × thousands of ticks) from "pattern smoke-tests" into actual race detection. The first TSan run caught a real bug in test_robustness_fuzz's act_exception_complete: it held a pointer to an ExceptionStore entry across fire_internal(RecoveryComplete), which deletes the entry. The subsequent state() read was a use-after-free. TSan flagged it 8 times (4 reads × 2 stack-frame variants). Fix is scoped lookup + re-check via has() after the mutation; matches the contract any reasonable caller would follow. The asio std_fenced_block atomic_thread_fence path generates TSan "not supported" warnings during compile — those are asio's, not ours, and don't affect runtime detection. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -11,6 +11,20 @@ endif()
|
||||
|
||||
add_compile_options(-Wall -Wextra -Wpedantic)
|
||||
|
||||
# --- ThreadSanitizer (opt-in) ---------------------------------------------
|
||||
# Build with -DSECSGEM_TSAN=ON to instrument every target with TSan.
|
||||
# Catches data races in EquipmentDataModel access from the io_context
|
||||
# thread vs. application threads — the contract documented in
|
||||
# INTEGRATION.md §3. CI runs the threading-relevant tests under this
|
||||
# flag in a separate lane; the default (release, no sanitizer) is what
|
||||
# customers build.
|
||||
option(SECSGEM_TSAN "Build with ThreadSanitizer" OFF)
|
||||
if(SECSGEM_TSAN)
|
||||
message(STATUS "ThreadSanitizer enabled — debug symbols + -fsanitize=thread")
|
||||
add_compile_options(-fsanitize=thread -g -O1 -fno-omit-frame-pointer)
|
||||
add_link_options(-fsanitize=thread)
|
||||
endif()
|
||||
|
||||
find_package(Threads REQUIRED)
|
||||
find_package(yaml-cpp REQUIRED)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user