Nota
L'accesso a questa pagina richiede l'autorizzazione. Puoi provare ad accedere o a cambiare directory.
L'accesso a questa pagina richiede l'autorizzazione. Puoi provare a cambiare directory.
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;
}