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;
}