Warnung C28616
Multithread-AV-Bedingung
Diese Warnung gibt an, dass ein Thread möglicherweise auf gelöschte Objekte zugreifen kann, wenn er vorzeitig entfernt wird.
Hinweise
Es sollte keinen Zugriff auf ein Objekt mit Verweiszählung geben, nachdem die Verweisanzahl bei 0 (null) liegt.
Name der Codeanalyse: INTERLOCKEDDECREMENT_MISUSE1
Beispiel
Der folgende Code generiert diese Warnung. Dies ist ein Beispiel für die Threadingzeitsequenz, die dieses Problem aufdecken könnte. In diesem Beispiel m_cRef
ist ein Member von this
:
Ein Thread T1 führt die if
Bedingung aus, verringert m_cRef
sich auf 1 und wird dann vorzeitig entfernt.
Ein anderer Thread T2 führt die if
Bedingung aus, dekrementiert m_cRef
auf 0, führt den if
Text aus (wobei this
gelöscht wird) und gibt zurück NULL
.
Wenn T1 neu geplant wird, wird auf Zeile 9 verwiesen m_cref
. Daher greift sie auf eine Membervariable zu, nachdem der zugehörige this
Zeiger gelöscht wurde – und wenn sich der Heap für das Objekt in einem unbekannten Zustand befindet.
ULONG CObject::Release()
{
if (0 == InterlockedDecrement(&m_cRef))
{
delete this;
return NULL;
}
/* this.m_cRef isn't thread safe */
return m_cRef;
}
Der folgende Code verweist nach dem Löschen des Objekts nicht auf Heapspeicher.
ULONG CObject::Release()
{
ASSERT(0 != m_cRef);
ULONG cRef = InterlockedDecrement(&m_cRef);
if (0 == cRef)
{
delete this;
return NULL;
}
return cRef;
}