OS: macOS 10.15.4 Compiler: brew installed clang-13 Build command:
make clean; ./autogen.sh; CC=/usr/local/Cellar/llvm/13.0.1/bin/clang CXX=/usr/local/Cellar/llvm/13.0.1/bin/clang++ LDFLAGS="-fuse-ld=/usr/local/Cellar/llvm/bin/13.0.1/ld.lld" ./configure --disable-wallet --with-sanitizers=thread; make; make check
<details> <summary>TSAN log</summary>
WARNING: ThreadSanitizer: data race (pid=85054)
Read of size 4 at 0x7fff9a2cd770 by thread T1 (mutexes: write M1762):
[#0](/bitcoin-bitcoin/0/) std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long) ostream:720 (test_bitcoin:x86_64+0x100074c35)
[#1](/bitcoin-bitcoin/1/) std::__1::__function::__func<$_0, std::__1::allocator<$_0>, void (std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)>::operator()(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) function.h:345 (test_bitcoin:x86_64+0x100080508)
[#2](/bitcoin-bitcoin/2/) BCLog::Logger::LogPrintStr(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int) logging.cpp:281 (test_bitcoin:x86_64+0x100be645b)
[#3](/bitcoin-bitcoin/3/) void LogPrintf_<char const*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int, char const*, char const* const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) logging.h:186 (test_bitcoin:x86_64+0x100aefb10)
[#4](/bitcoin-bitcoin/4/) std::__1::__function::__func<CMainSignals::TransactionRemovedFromMempool(std::__1::shared_ptr<CTransaction const> const&, MemPoolRemovalReason, unsigned long long)::$_7, std::__1::allocator<CMainSignals::TransactionRemovedFromMempool(std::__1::shared_ptr<CTransaction const> const&, MemPoolRemovalReason, unsigned long long)::$_7>, void ()>::operator()() function.h:345 (test_bitcoin:x86_64+0x100af682a)
[#5](/bitcoin-bitcoin/5/) SingleThreadedSchedulerClient::ProcessQueue() scheduler.cpp:177 (test_bitcoin:x86_64+0x100b8a175)
[#6](/bitcoin-bitcoin/6/) std::__1::__function::__func<std::__1::__bind<void (SingleThreadedSchedulerClient::*)(), SingleThreadedSchedulerClient*>, std::__1::allocator<std::__1::__bind<void (SingleThreadedSchedulerClient::*)(), SingleThreadedSchedulerClient*> >, void ()>::operator()() function.h:345 (test_bitcoin:x86_64+0x100b8c15a)
[#7](/bitcoin-bitcoin/7/) CScheduler::serviceQueue() scheduler.cpp:64 (test_bitcoin:x86_64+0x100b89454)
[#8](/bitcoin-bitcoin/8/) std::__1::__function::__func<ChainTestingSetup::ChainTestingSetup(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::vector<char const*, std::__1::allocator<char const*> > const&)::$_0, std::__1::allocator<ChainTestingSetup::ChainTestingSetup(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::vector<char const*, std::__1::allocator<char const*> > const&)::$_0>, void ()>::operator()() function.h:345 (test_bitcoin:x86_64+0x1007bf5f8)
[#9](/bitcoin-bitcoin/9/) util::TraceThread(char const*, std::__1::function<void ()>) thread.cpp:18 (test_bitcoin:x86_64+0x100c13ecf)
[#10](/bitcoin-bitcoin/10/) void* std::__1::__thread_proxy<std::__1::tuple<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct> >, void (*)(char const*, std::__1::function<void ()>), char const*, ChainTestingSetup::ChainTestingSetup(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::vector<char const*, std::__1::allocator<char const*> > const&)::$_0> >(void*) thread:291 (test_bitcoin:x86_64+0x1007bf19f)
Previous write of size 4 at 0x7fff9a2cd770 by main thread (mutexes: write M455, write M132977):
[#0](/bitcoin-bitcoin/0/) boost::unit_test::unit_test_log_t::operator<<(boost::unit_test::log::begin const&) unit_test_log.ipp:412 (test_bitcoin:x86_64+0x10001d2e6)
[#1](/bitcoin-bitcoin/1/) boost::test_tools::tt_detail::report_assertion(boost::test_tools::assertion_result const&, boost::unit_test::lazy_ostream const&, boost::unit_test::basic_cstring<char const>, unsigned long, boost::test_tools::tt_detail::tool_level, boost::test_tools::tt_detail::check_type, unsigned long, ...) test_tools.ipp:359 (test_bitcoin:x86_64+0x100029f5e)
[#2](/bitcoin-bitcoin/2/) blockencodings_tests::SimpleRoundTripTest::test_method() blockencodings_tests.cpp:101 (test_bitcoin:x86_64+0x10016b0ff)
[#3](/bitcoin-bitcoin/3/) blockencodings_tests::SimpleRoundTripTest_invoker() blockencodings_tests.cpp:55 (test_bitcoin:x86_64+0x100169311)
[#4](/bitcoin-bitcoin/4/) boost::detail::function::void_function_invoker0<void (*)(), void>::invoke(boost::detail::function::function_buffer&) function_template.hpp:117 (test_bitcoin:x86_64+0x10010017d)
[#5](/bitcoin-bitcoin/5/) boost::detail::function::function_obj_invoker0<boost::detail::forward, int>::invoke(boost::detail::function::function_buffer&) function_template.hpp:137 (test_bitcoin:x86_64+0x10007d8ba)
[#6](/bitcoin-bitcoin/6/) boost::execution_monitor::catch_signals(boost::function<int ()> const&) execution_monitor.ipp:901 (test_bitcoin:x86_64+0x100023379)
[#7](/bitcoin-bitcoin/7/) boost::execution_monitor::execute(boost::function<int ()> const&) execution_monitor.ipp:1299 (test_bitcoin:x86_64+0x10002366a)
[#8](/bitcoin-bitcoin/8/) boost::unit_test::unit_test_monitor_t::execute_and_translate(boost::function<void ()> const&, unsigned long) unit_test_monitor.ipp:49 (test_bitcoin:x86_64+0x10001c5be)
[#9](/bitcoin-bitcoin/9/) boost::unit_test::framework::state::execute_test_tree(unsigned long, unsigned long, boost::unit_test::framework::state::random_generator_helper const*) framework.ipp:815 (test_bitcoin:x86_64+0x10001e993)
[#10](/bitcoin-bitcoin/10/) boost::unit_test::framework::state::execute_test_tree(unsigned long, unsigned long, boost::unit_test::framework::state::random_generator_helper const*) framework.ipp:740 (test_bitcoin:x86_64+0x10001fa1c)
[#11](/bitcoin-bitcoin/11/) boost::unit_test::framework::state::execute_test_tree(unsigned long, unsigned long, boost::unit_test::framework::state::random_generator_helper const*) framework.ipp:740 (test_bitcoin:x86_64+0x10001fa1c)
[#12](/bitcoin-bitcoin/12/) boost::unit_test::framework::run(unsigned long, bool) framework.ipp:1721 (test_bitcoin:x86_64+0x10001b158)
[#13](/bitcoin-bitcoin/13/) boost::unit_test::unit_test_main(boost::unit_test::test_suite* (*)(int, char**), int, char**) unit_test_main.ipp:250 (test_bitcoin:x86_64+0x10003447b)
[#14](/bitcoin-bitcoin/14/) main unit_test_main.ipp:306 (test_bitcoin:x86_64+0x100034b1b)
Location is global 'std::__1::cout' at 0x7fff9a2cd760 (libc++.1.dylib+0x000029394770)
Mutex M1762 (0x7b2c000000b0) created at:
[#0](/bitcoin-bitcoin/0/) pthread_mutex_lock <null>:2 (libclang_rt.tsan_osx_dynamic.dylib:x86_64+0x19840)
[#1](/bitcoin-bitcoin/1/) std::__1::mutex::lock() <null>:2 (libc++.1.dylib:x86_64+0x36538)
[#2](/bitcoin-bitcoin/2/) BasicTestingSetup::BasicTestingSetup(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::vector<char const*, std::__1::allocator<char const*> > const&) setup_common.cpp:121 (test_bitcoin:x86_64+0x1007b92e6)
[#3](/bitcoin-bitcoin/3/) ChainTestingSetup::ChainTestingSetup(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::vector<char const*, std::__1::allocator<char const*> > const&) setup_common.cpp:151 (test_bitcoin:x86_64+0x1007ba2e2)
[#4](/bitcoin-bitcoin/4/) TestingSetup::TestingSetup(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::vector<char const*, std::__1::allocator<char const*> > const&) setup_common.cpp:190 (test_bitcoin:x86_64+0x1007bab35)
[#5](/bitcoin-bitcoin/5/) blockencodings_tests::SimpleRoundTripTest_invoker() blockencodings_tests.cpp:55 (test_bitcoin:x86_64+0x100168e7c)
[#6](/bitcoin-bitcoin/6/) boost::detail::function::void_function_invoker0<void (*)(), void>::invoke(boost::detail::function::function_buffer&) function_template.hpp:117 (test_bitcoin:x86_64+0x10010017d)
[#7](/bitcoin-bitcoin/7/) boost::detail::function::function_obj_invoker0<boost::detail::forward, int>::invoke(boost::detail::function::function_buffer&) function_template.hpp:137 (test_bitcoin:x86_64+0x10007d8ba)
[#8](/bitcoin-bitcoin/8/) boost::execution_monitor::catch_signals(boost::function<int ()> const&) execution_monitor.ipp:901 (test_bitcoin:x86_64+0x100023379)
[#9](/bitcoin-bitcoin/9/) boost::execution_monitor::execute(boost::function<int ()> const&) execution_monitor.ipp:1299 (test_bitcoin:x86_64+0x10002366a)
[#10](/bitcoin-bitcoin/10/) boost::unit_test::unit_test_monitor_t::execute_and_translate(boost::function<void ()> const&, unsigned long) unit_test_monitor.ipp:49 (test_bitcoin:x86_64+0x10001c5be)
[#11](/bitcoin-bitcoin/11/) boost::unit_test::framework::state::execute_test_tree(unsigned long, unsigned long, boost::unit_test::framework::state::random_generator_helper const*) framework.ipp:815 (test_bitcoin:x86_64+0x10001e993)
[#12](/bitcoin-bitcoin/12/) boost::unit_test::framework::state::execute_test_tree(unsigned long, unsigned long, boost::unit_test::framework::state::random_generator_helper const*) framework.ipp:740 (test_bitcoin:x86_64+0x10001fa1c)
[#13](/bitcoin-bitcoin/13/) boost::unit_test::framework::state::execute_test_tree(unsigned long, unsigned long, boost::unit_test::framework::state::random_generator_helper const*) framework.ipp:740 (test_bitcoin:x86_64+0x10001fa1c)
[#14](/bitcoin-bitcoin/14/) boost::unit_test::framework::run(unsigned long, bool) framework.ipp:1721 (test_bitcoin:x86_64+0x10001b158)
[#15](/bitcoin-bitcoin/15/) boost::unit_test::unit_test_main(boost::unit_test::test_suite* (*)(int, char**), int, char**) unit_test_main.ipp:250 (test_bitcoin:x86_64+0x10003447b)
[#16](/bitcoin-bitcoin/16/) main unit_test_main.ipp:306 (test_bitcoin:x86_64+0x100034b1b)
Mutex M455 (0x00010f089170) created at:
[#0](/bitcoin-bitcoin/0/) pthread_mutex_init <null>:2 (libclang_rt.tsan_osx_dynamic.dylib:x86_64+0xb1a5)
[#1](/bitcoin-bitcoin/1/) std::__1::recursive_mutex::recursive_mutex() <null>:2 (libc++.1.dylib:x86_64+0x365db)
[#2](/bitcoin-bitcoin/2/) ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) <null>:2 (dyld:x86_64+0x1b1e2)
Mutex M132977 (0x7ffee1ba44b8) created at:
[#0](/bitcoin-bitcoin/0/) pthread_mutex_init <null>:2 (libclang_rt.tsan_osx_dynamic.dylib:x86_64+0xb1a5)
[#1](/bitcoin-bitcoin/1/) std::__1::recursive_mutex::recursive_mutex() <null>:2 (libc++.1.dylib:x86_64+0x365db)
[#2](/bitcoin-bitcoin/2/) CTxMemPool::CTxMemPool(CBlockPolicyEstimator*, int) txmempool.cpp:456 (test_bitcoin:x86_64+0x100a708fb)
[#3](/bitcoin-bitcoin/3/) blockencodings_tests::SimpleRoundTripTest::test_method() blockencodings_tests.cpp:57 (test_bitcoin:x86_64+0x10016991e)
[#4](/bitcoin-bitcoin/4/) blockencodings_tests::SimpleRoundTripTest_invoker() blockencodings_tests.cpp:55 (test_bitcoin:x86_64+0x100169311)
[#5](/bitcoin-bitcoin/5/) boost::detail::function::void_function_invoker0<void (*)(), void>::invoke(boost::detail::function::function_buffer&) function_template.hpp:117 (test_bitcoin:x86_64+0x10010017d)
[#6](/bitcoin-bitcoin/6/) boost::detail::function::function_obj_invoker0<boost::detail::forward, int>::invoke(boost::detail::function::function_buffer&) function_template.hpp:137 (test_bitcoin:x86_64+0x10007d8ba)
[#7](/bitcoin-bitcoin/7/) boost::execution_monitor::catch_signals(boost::function<int ()> const&) execution_monitor.ipp:901 (test_bitcoin:x86_64+0x100023379)
[#8](/bitcoin-bitcoin/8/) boost::execution_monitor::execute(boost::function<int ()> const&) execution_monitor.ipp:1299 (test_bitcoin:x86_64+0x10002366a)
[#9](/bitcoin-bitcoin/9/) boost::unit_test::unit_test_monitor_t::execute_and_translate(boost::function<void ()> const&, unsigned long) unit_test_monitor.ipp:49 (test_bitcoin:x86_64+0x10001c5be)
[#10](/bitcoin-bitcoin/10/) boost::unit_test::framework::state::execute_test_tree(unsigned long, unsigned long, boost::unit_test::framework::state::random_generator_helper const*) framework.ipp:815 (test_bitcoin:x86_64+0x10001e993)
[#11](/bitcoin-bitcoin/11/) boost::unit_test::framework::state::execute_test_tree(unsigned long, unsigned long, boost::unit_test::framework::state::random_generator_helper const*) framework.ipp:740 (test_bitcoin:x86_64+0x10001fa1c)
[#12](/bitcoin-bitcoin/12/) boost::unit_test::framework::state::execute_test_tree(unsigned long, unsigned long, boost::unit_test::framework::state::random_generator_helper const*) framework.ipp:740 (test_bitcoin:x86_64+0x10001fa1c)
[#13](/bitcoin-bitcoin/13/) boost::unit_test::framework::run(unsigned long, bool) framework.ipp:1721 (test_bitcoin:x86_64+0x10001b158)
[#14](/bitcoin-bitcoin/14/) boost::unit_test::unit_test_main(boost::unit_test::test_suite* (*)(int, char**), int, char**) unit_test_main.ipp:250 (test_bitcoin:x86_64+0x10003447b)
[#15](/bitcoin-bitcoin/15/) main unit_test_main.ipp:306 (test_bitcoin:x86_64+0x100034b1b)
Thread T1 (tid=18855157, running) created by main thread at:
[#0](/bitcoin-bitcoin/0/) pthread_create <null>:2 (libclang_rt.tsan_osx_dynamic.dylib:x86_64+0x9fdf)
[#1](/bitcoin-bitcoin/1/) ChainTestingSetup::ChainTestingSetup(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::vector<char const*, std::__1::allocator<char const*> > const&) setup_common.cpp:156 (test_bitcoin:x86_64+0x1007ba3c2)
[#2](/bitcoin-bitcoin/2/) TestingSetup::TestingSetup(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::vector<char const*, std::__1::allocator<char const*> > const&) setup_common.cpp:190 (test_bitcoin:x86_64+0x1007bab35)
[#3](/bitcoin-bitcoin/3/) blockencodings_tests::SimpleRoundTripTest_invoker() blockencodings_tests.cpp:55 (test_bitcoin:x86_64+0x100168e7c)
[#4](/bitcoin-bitcoin/4/) boost::detail::function::void_function_invoker0<void (*)(), void>::invoke(boost::detail::function::function_buffer&) function_template.hpp:117 (test_bitcoin:x86_64+0x10010017d)
[#5](/bitcoin-bitcoin/5/) boost::detail::function::function_obj_invoker0<boost::detail::forward, int>::invoke(boost::detail::function::function_buffer&) function_template.hpp:137 (test_bitcoin:x86_64+0x10007d8ba)
[#6](/bitcoin-bitcoin/6/) boost::execution_monitor::catch_signals(boost::function<int ()> const&) execution_monitor.ipp:901 (test_bitcoin:x86_64+0x100023379)
[#7](/bitcoin-bitcoin/7/) boost::execution_monitor::execute(boost::function<int ()> const&) execution_monitor.ipp:1299 (test_bitcoin:x86_64+0x10002366a)
[#8](/bitcoin-bitcoin/8/) boost::unit_test::unit_test_monitor_t::execute_and_translate(boost::function<void ()> const&, unsigned long) unit_test_monitor.ipp:49 (test_bitcoin:x86_64+0x10001c5be)
[#9](/bitcoin-bitcoin/9/) boost::unit_test::framework::state::execute_test_tree(unsigned long, unsigned long, boost::unit_test::framework::state::random_generator_helper const*) framework.ipp:815 (test_bitcoin:x86_64+0x10001e993)
[#10](/bitcoin-bitcoin/10/) boost::unit_test::framework::state::execute_test_tree(unsigned long, unsigned long, boost::unit_test::framework::state::random_generator_helper const*) framework.ipp:740 (test_bitcoin:x86_64+0x10001fa1c)
[#11](/bitcoin-bitcoin/11/) boost::unit_test::framework::state::execute_test_tree(unsigned long, unsigned long, boost::unit_test::framework::state::random_generator_helper const*) framework.ipp:740 (test_bitcoin:x86_64+0x10001fa1c)
[#12](/bitcoin-bitcoin/12/) boost::unit_test::framework::run(unsigned long, bool) framework.ipp:1721 (test_bitcoin:x86_64+0x10001b158)
[#13](/bitcoin-bitcoin/13/) boost::unit_test::unit_test_main(boost::unit_test::test_suite* (*)(int, char**), int, char**) unit_test_main.ipp:250 (test_bitcoin:x86_64+0x10003447b)
[#14](/bitcoin-bitcoin/14/) main unit_test_main.ipp:306 (test_bitcoin:x86_64+0x100034b1b)
SUMMARY: ThreadSanitizer: data race ostream:720 in std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long)
</details>
I was only able to reproduce this with make check instead of running the test individually via test_bitcoin. I also tried on ubuntu:impish with clang-13 and the issue doesn't happen. It seems to be logging-related, similar to #23366. The following diff suppresses the error, but as I could only reproduce on macOS, I'm not sure if it's worth merging:
diff --git a/test/sanitizer_suppressions/tsan b/test/sanitizer_suppressions/tsan
index 3acf575d0..35732c611 100644
--- a/test/sanitizer_suppressions/tsan
+++ b/test/sanitizer_suppressions/tsan
@@ -40,3 +40,5 @@ race:epoll_ctl
# [#23366](/bitcoin-bitcoin/23366/)
race:std::__1::ios_base::*
+
+race:std::__1::basic_ostream*