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.
{
    complete = false;
    int64_t nTimeMicros = GetTimeMicros();
    LOCK(cs_vRecv);
    nLastRecv = nTimeMicros / 1000000;
    nRecvBytes += nBytes;
    while (nBytes > 0) {
        
        int handled = m_deserializer->Read(pch, nBytes);
        if (handled < 0) return false;
        pch += handled;
        nBytes -= handled;
        if (m_deserializer->Complete()) {
            
            CNetMessage msg = m_deserializer->GetMessage(Params().MessageStart(), nTimeMicros);
            
            
            mapMsgCmdSize::iterator i = mapRecvBytesPerMsgCmd.find(msg.m_command);
            if (i == mapRecvBytesPerMsgCmd.end())
                i = mapRecvBytesPerMsgCmd.find(NET_MESSAGE_COMMAND_OTHER);
            assert(i != mapRecvBytesPerMsgCmd.end());
            i->second += msg.m_raw_message_size;
            
            vRecvMsg.push_back(std::move(msg));
            complete = true;
        }
    }
    return true;
}
void CNode::SetSendVersion(int nVersionIn)