Sergei Zimmerman (xokdvium) | Ok my hypothesis was wrong. Boost's BOOST_HAS_THREADS is never false for us. It seems like a cross-thread ownership issue:
SUMMARY: ThreadSanitizer: heap-use-after-free (/nix/store/cgz3m1ahqxkw9f59b5vfxrdck0nksapi-nix-store-2.35.0pre/lib/libnixstore.so.2.35.0+0x2892d4) in nix::findRuntimeRootsUnchecked[abi:cxx11](nix::StoreDirConfig const&)
==================
==================
WARNING: ThreadSanitizer: heap-use-after-free (pid=765420)
Read of size 4 at 0x724c00020230 by thread T18:
#0 nix::findRuntimeRootsUnchecked[abi:cxx11](nix::StoreDirConfig const&) <null> (libnixstore.so.2.35.0+0x289504)
#1 nix::LocalStore::findRuntimeRoots(boost::unordered::unordered_flat_map<nix::StorePath, boost::unordered::unordered_flat_set<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, nix::StringViewHash, std::equal_to<void>, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::hash<nix::StorePath>, std::equal_to<nix::StorePath>, std::allocator<std::pair<nix::StorePath const, boost::unordered::unordered_flat_set<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, nix::StringViewHash, std::equal_to<void>, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > > >&, bool) <null> (libnixstore.so.2.35.0+0x238a15)
#2 nix::LocalStore::findRootsNoTemp(boost::unordered::unordered_flat_map<nix::StorePath, boost::unordered::unordered_flat_set<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, nix::StringViewHash, std::equal_to<void>, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::hash<nix::StorePath>, std::equal_to<nix::StorePath>, std::allocator<std::pair<nix::StorePath const, boost::unordered::unordered_flat_set<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, nix::StringViewHash, std::equal_to<void>, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > > >&, bool) <null> (libnixstore.so.2.35.0+0x23bc45)
#3 nix::LocalStore::collectGarbage(nix::GCOptions const&, nix::GCResults&) <null> (libnixstore.so.2.35.0+0x24339b)
#4 nix::LocalStore::autoGC(bool)::{lambda()#2}::operator()() [clone .lto_priv.0] <null> (libnixstore.so.2.35.0+0x242752)
#5 std::thread::_State_impl<std::thread::_Invoker<std::tuple<nix::LocalStore::autoGC(bool)::{lambda()#2}> > >::_M_run() [clone .lto_priv.0] <null> (libnixstore.so.2.35.0+0x4955ad)
#6 execute_native_thread_routine <null> (libstdc++.so.6+0xed063)
Previous write of size 8 at 0x724c00020230 by thread T18:
#0 operator delete(void*, unsigned long) <null> (libtsan.so.2+0xa4a2b)
#1 nix::readProcLink(std::filesystem::__cxx11::path const&, boost::unordered::unordered_flat_map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::unordered::unordered_flat_set<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, nix::StringViewHash, std::equal_to<void>, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, nix::StringViewHash, std::equal_to<void>, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, boost::unordered::unordered_flat_set<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, nix::StringViewHash, std::equal_to<void>, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > > >&) [clone .lto_priv.0] <null> (libnixstore.so.2.35.0+0x282dd7)
#2 nix::findRuntimeRootsUnchecked[abi:cxx11](nix::StoreDirConfig const&) <null> (libnixstore.so.2.35.0+0x28b066)
#3 nix::LocalStore::findRuntimeRoots(boost::unordered::unordered_flat_map<nix::StorePath, boost::unordered::unordered_flat_set<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, nix::StringViewHash, std::equal_to<void>, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::hash<nix::StorePath>, std::equal_to<nix::StorePath>, std::allocator<std::pair<nix::StorePath const, boost::unordered::unordered_flat_set<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, nix::StringViewHash, std::equal_to<void>, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > > >&, bool) <null> (libnixstore.so.2.35.0+0x238a15)
#4 nix::LocalStore::findRootsNoTemp(boost::unordered::unordered_flat_map<nix::StorePath, boost::unordered::unordered_flat_set<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, nix::StringViewHash, std::equal_to<void>, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::hash<nix::StorePath>, std::equal_to<nix::StorePath>, std::allocator<std::pair<nix::StorePath const, boost::unordered::unordered_flat_set<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, nix::StringViewHash, std::equal_to<void>, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > > >&, bool) <null> (libnixstore.so.2.35.0+0x23bc45)
#5 nix::LocalStore::collectGarbage(nix::GCOptions const&, nix::GCResults&) <null> (libnixstore.so.2.35.0+0x24339b)
#6 nix::LocalStore::autoGC(bool)::{lambda()#2}::operator()() [clone .lto_priv.0] <null> (libnixstore.so.2.35.0+0x242752)
#7 std::thread::_State_impl<std::thread::_Invoker<std::tuple<nix::LocalStore::autoGC(bool)::{lambda()#2}> > >::_M_run() [clone .lto_priv.0] <null> (libnixstore.so.2.35.0+0x4955ad)
#8 execute_native_thread_routine <null> (libstdc++.so.6+0xed063)
| 16:42:59 |