From a902c951552c68dcf35645c54c015d259427fba2 Mon Sep 17 00:00:00 2001 From: "Tachikoma (Codex GPT-5)" Date: Sun, 2 Aug 2026 23:52:04 -0400 Subject: [PATCH 1/3] Annotate intentional handler fallthrough Co-authored-by: Andrew Kesterson --- CMakeLists.txt | 8 ++++++++ include/akerror.tmpl.h | 13 +++++++++++++ 2 files changed, 21 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 69dbe30..d4495af 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -263,6 +263,14 @@ foreach(_test IN LISTS AKERR_TESTS) endif() endforeach() +# HANDLE_GROUP deliberately enters the next case label. Keep that public macro +# compiling with the warning enabled, so a future macro edit cannot restore the +# warning for consumers which adopt -Wextra. +if(CMAKE_C_COMPILER_ID MATCHES "GNU|Clang") + target_compile_options(test_err_handle_group PRIVATE + -Werror=implicit-fallthrough) +endif() + set_tests_properties( ${AKERR_WILL_FAIL_TESTS} PROPERTIES WILL_FAIL TRUE diff --git a/include/akerror.tmpl.h b/include/akerror.tmpl.h index dad4c45..ede8fcc 100644 --- a/include/akerror.tmpl.h +++ b/include/akerror.tmpl.h @@ -391,6 +391,18 @@ akerr_ErrorContext AKERR_NOIGNORE *__akerr_copy_string(char *destination, int ca * Defines for the ATTEMPT/CATCH/CLEANUP/PROCESS/HANDLE/FINISH process */ +/* + * HANDLE_GROUP deliberately enters the next case label. GCC and clang both + * understand this spelling in the C modes supported by libakerror. Other + * compilers keep the established control flow without receiving an attribute + * they do not implement. + */ +#if defined(__GNUC__) || defined(__clang__) +#define AKERR_FALLTHROUGH __attribute__((fallthrough)); +#else +#define AKERR_FALLTHROUGH +#endif + #define ATTEMPT \ switch ( 0 ) { \ case 0: \ @@ -443,6 +455,7 @@ akerr_ErrorContext AKERR_NOIGNORE *__akerr_copy_string(char *destination, int ca __err_context->handled = true; #define HANDLE_GROUP(__err_context, __err_status) \ + AKERR_FALLTHROUGH \ case __err_status: \ __err_context->stacktracebufptr = (char *)&__err_context->stacktracebuf; \ __err_context->handled = true; -- 2.43.0 From 0a6cb303f533499cbf92a9f99336dc3d9d9fdf0c Mon Sep 17 00:00:00 2001 From: "Tachikoma (Codex GPT-5)" Date: Mon, 3 Aug 2026 07:28:40 -0400 Subject: [PATCH 2/3] Run ThreadSanitizer tests without ASLR Co-authored-by: Andrew Kesterson --- CMakeLists.txt | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index d4495af..4ea8499 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -107,6 +107,19 @@ if(AKERR_SANITIZE AND NOT CMAKE_C_COMPILER_ID MATCHES "GNU|Clang") "AKERR_SANITIZE requires GCC or Clang, not ${CMAKE_C_COMPILER_ID}") endif() +if(AKERR_SANITIZE STREQUAL "thread" AND CMAKE_SYSTEM_NAME STREQUAL "Linux") + # ThreadSanitizer reserves a fixed, very large virtual-address range. Linux + # ASLR can put a loader mapping inside it before the runtime starts, which + # makes every test fail with "unexpected memory mapping" before main(). + # Run the instrumented tests under the normal util-linux ASLR wrapper. + find_program(AKERR_SETARCH_EXECUTABLE setarch) + if(NOT AKERR_SETARCH_EXECUTABLE) + message(FATAL_ERROR + "AKERR_SANITIZE=thread on Linux requires setarch (util-linux) to " + "start tests with ASLR disabled.") + endif() +endif() + function(akerr_instrument_for_sanitizers _target) if(AKERR_SANITIZE) target_compile_options(${_target} PRIVATE @@ -252,7 +265,13 @@ foreach(_test IN LISTS AKERR_TESTS) target_link_libraries(test_${_test} PRIVATE Threads::Threads) endif() akerr_instrument_for_sanitizers(test_${_test}) - add_test(NAME ${_test} COMMAND test_${_test}) + if(AKERR_SANITIZE STREQUAL "thread" AND CMAKE_SYSTEM_NAME STREQUAL "Linux") + add_test(NAME ${_test} + COMMAND ${AKERR_SETARCH_EXECUTABLE} ${CMAKE_SYSTEM_PROCESSOR} + -R $) + else() + add_test(NAME ${_test} COMMAND test_${_test}) + endif() # A sanitizer report is a test failure. Without halt_on_error the runtime # prints and continues, which leaves a race to be noticed in the log by # somebody reading it -- and under a race storm the reporting itself is slow -- 2.43.0 From 997828116bc6f27cf023e7a38cfb5e10329e203d Mon Sep 17 00:00:00 2001 From: "Tachikoma (Codex GPT-5)" Date: Mon, 3 Aug 2026 07:49:28 -0400 Subject: [PATCH 3/3] Install the ThreadSanitizer ASLR runner Co-authored-by: Andrew Kesterson --- .gitea/workflows/ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitea/workflows/ci.yaml b/.gitea/workflows/ci.yaml index d46f8f8..9af1553 100644 --- a/.gitea/workflows/ci.yaml +++ b/.gitea/workflows/ci.yaml @@ -75,7 +75,7 @@ jobs: - name: dependencies run: | sudo apt-get update -y - sudo apt-get install -y cmake gcc moreutils + sudo apt-get install -y cmake gcc moreutils util-linux # The thread tests assert exclusive ownership of pool slots and reserved # ranges, which is checkable without tooling and runs in the job above. # This is the run that proves there is no data race underneath them. -- 2.43.0