Advertencia C28616
Condición de AV multiproceso
Esta advertencia indica que un subproceso puede tener acceso a objetos eliminados si se adelantó.
Comentarios
No debe haber acceso a un objeto con recuento de referencias después de que el recuento de referencias sea cero.
Nombre del análisis de código: INTERLOCKEDDECREMENT_MISUSE1
Ejemplo
El código siguiente genera esta advertencia. Este es un ejemplo de secuencia de tiempo de subproceso que podría exponer este problema. En este ejemplo, m_cRef
es miembro de this
:
Un subproceso T1 ejecuta la if
condición, disminuye en m_cRef
1 y, a continuación, se adelanta.
Otro subproceso T2 ejecuta la if
condición, disminuye en m_cRef
0, ejecuta el if
cuerpo (donde this
se elimina) y devuelve NULL
.
Cuando se vuelva a programar T1, hará referencia m_cref
a la línea 9. Por lo tanto, tendrá acceso a una variable miembro después de eliminar el puntero relacionado this
y cuando el montón del objeto esté en un estado desconocido.
ULONG CObject::Release()
{
if (0 == InterlockedDecrement(&m_cRef))
{
delete this;
return NULL;
}
/* this.m_cRef isn't thread safe */
return m_cRef;
}
El código siguiente no hace referencia a ninguna memoria del montón después de eliminar el objeto.
ULONG CObject::Release()
{
ASSERT(0 != m_cRef);
ULONG cRef = InterlockedDecrement(&m_cRef);
if (0 == cRef)
{
delete this;
return NULL;
}
return cRef;
}