diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8a27ff92..7c663c98 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -68,6 +68,8 @@ 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 new file mode 100644 index 00000000..153fbba7 --- /dev/null +++ b/test/thread_sanitizer_suppressions.txt @@ -0,0 +1,32 @@ +# 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