This is a well known (long standing) issue. Documented in the code base in commit eea02be70ee37b845f2719b3c08e5baf4b6f51f6.

Countless intermittent sanitizer warnings can be attributed to it.
std::vector<CAddress> vAddrToSend;
    const std::unique_ptr<CRollingBloomFilter> m_addr_known;
    bool fGetAddr{false};
    int64_t nNextAddrSend GUARDED_BY(cs_sendProcessing){0};
    int64_t nNextLocalAddrSend GUARDED_BY(cs_sendProcessing){0};
    bool IsAddrRelayPeer() const { return m_addr_known != nullptr; }
    
    
    
    std::vector<uint256> vInventoryBlockToSend GUARDED_BY(cs_inventory);
    RecursiveMutex cs_inventory;
    struct TxRelay {
        TxRelay() { pfilter = MakeUnique<CBloomFilter>(); }
        mutable RecursiveMutex cs_filter;
        
        
        
        
        bool fRelayTxes GUARDED_BY(cs_filter){false};
        std::unique_ptr<CBloomFilter> pfilter PT_GUARDED_BY(cs_filter) GUARDED_BY(cs_filter);
        mutable RecursiveMutex cs_tx_inventory;
        CRollingBloomFilter filterInventoryKnown GUARDED_BY(cs_tx_inventory){50000, 0.000001};
        
        
        std::set<uint256> setInventoryTxToSend;
        
        bool fSendMempool GUARDED_BY(cs_tx_inventory){false};
        
        std::atomic<std::chrono::seconds> m_last_mempool_req{std::chrono::seconds{0}};