Avviso C28616

Condizione AV multithreaded

Questo avviso indica che un thread ha la possibilità di accedere agli oggetti eliminati se viene ignorato.

Commenti

Non è necessario accedere a un oggetto con conteggio dei riferimenti dopo che il conteggio dei riferimenti è pari a zero.

Nome analisi del codice: INTERLOCKEDDECREMENT_MISUSE1

Esempio

Il codice seguente genera questo avviso. Si tratta di un esempio di sequenza temporale di threading che potrebbe esporre questo problema. In questo esempio è m_cRef un membro di this:

Un thread T1 esegue la if condizione, decrementa m_cRef su 1 e viene quindi preceduta.

Un altro thread T2 esegue la if condizione, decrementa m_cRef a 0, esegue il if corpo (dove this viene eliminato) e restituisce NULL.

Quando T1 viene riprogrammato, farà riferimento m_cref alla riga 9. Quindi accederà a una variabile membro dopo l'eliminazione del puntatore correlato this e quando l'heap per l'oggetto è in uno stato sconosciuto.

ULONG CObject::Release()
{
    if (0 == InterlockedDecrement(&m_cRef))
    {
        delete this;
        return NULL;
    }
    /* this.m_cRef isn't thread safe */
    return m_cRef;
}

Il codice seguente non fa riferimento a alcuna memoria heap dopo l'eliminazione dell'oggetto.

ULONG CObject::Release()
{
    ASSERT(0 != m_cRef);
    ULONG cRef = InterlockedDecrement(&m_cRef);
    if (0 == cRef)
    {
        delete this;
        return NULL;
    }
    return cRef;
}