Freigeben über


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