Partager via


Avertissement C28616

Condition AV multithread

Cet avertissement indique qu’un thread a le potentiel d’accéder aux objets supprimés s’il est préempté.

Remarques

Il ne doit pas y avoir d’accès à un objet compte de référence une fois que le nombre de références est égal à zéro.

Nom de l’analyse du code : INTERLOCKEDDECREMENT_MISUSE1

Exemple

Le code suivant génère cet avertissement. Il s’agit d’un exemple de séquence de temps de thread qui pourrait exposer ce problème. Dans cet exemple, m_cRef est membre de this:

Un thread T1 exécute la if condition, décrémente m_cRef sur 1, puis est préempté.

Un autre thread T2 exécute la if condition, décrémente m_cRef sur 0, exécute le if corps (où this est supprimé) et retourne NULL.

Lorsque T1 est replanifié, il fait référence m_cref à la ligne 9. Ainsi, il accède à une variable membre après la suppression du pointeur associé this et lorsque le tas de l’objet est dans un état inconnu.

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

Le code suivant ne fait aucune référence à la mémoire du tas après la suppression de l’objet.

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