From 7e63d4ae9ab46f45038b4c3e19a13b80e1e4115c Mon Sep 17 00:00:00 2001 From: Dennis Klein Date: Wed, 10 Jun 2026 16:16:30 +0200 Subject: [PATCH] test: drop thread-sanitizer suppressions - every entry stood in for a library tsan could not see into; with libzmq, libsodium and libstdc++ now tsan-instrumented in the tsan CI job, the happens-before edges they establish are visible and nothing is left to suppress - suppressions were blunt (a race: entry matches any frame in the stack), so they could also mask real races passing through those frames --- .github/workflows/ci.yml | 2 -- test/thread_sanitizer_suppressions.txt | 32 -------------------------- 2 files changed, 34 deletions(-) delete mode 100644 test/thread_sanitizer_suppressions.txt diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index cae2bb79..e4321703 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -68,8 +68,6 @@ jobs: if: github.repository == 'FairRootGroup/FairMQ' name: ${{ matrix.sanitizer.name }} runs-on: ubuntu-24.04 - env: - TSAN_OPTIONS: suppressions=${{ github.workspace }}/test/thread_sanitizer_suppressions.txt strategy: fail-fast: false matrix: diff --git a/test/thread_sanitizer_suppressions.txt b/test/thread_sanitizer_suppressions.txt deleted file mode 100644 index 153fbba7..00000000 --- a/test/thread_sanitizer_suppressions.txt +++ /dev/null @@ -1,32 +0,0 @@ -# ThreadSanitizer suppressions for FairMQ. -# -# libzmq is not built with -fsanitize=thread, so tsan cannot observe the -# happens-before that its inproc/socket queues establish between the user -# threads and libzmq's I/O threads. This produces false-positive data races -# on message buffers handed across that boundary. The proper fix is to build -# libzmq with tsan as well; until then these races are suppressed. - -# Racy access made directly from libzmq (encoder/decoder memcpy, -# signaler/epoll, recv). -called_from_lib:libzmq.so - -# Zero-copy message deleters that libzmq runs from msg_t::close once it is -# done with a buffer; the happens-before with the buffer's producer runs -# through libzmq's queue. -race:zmq::msg_t::close -race:fair::mq::TransportFactory::SimpleMsgCleanup - -# shmem message metadata read on the user side after delivery through libzmq -# (the shmem transport ships its metadata over a zeromq channel). -race:fair::mq::shmem::Message::Message -race:fair::mq::shmem::Socket::Receive -race:fair::mq::shmem::ShmHeader - -# Multipart message buffers written by the sending thread and read back by the -# receiving thread after delivery through libzmq's inproc queue; the -# happens-before runs through that non-instrumented queue. -race:RunMultiThreadedMultipart - -# std::regex / std::locale facet lazy-init races inside libstdc++. -race:fair::mq::Channel::Validate -race:fair::mq::tools::ToString