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