Aviso C28616
Condição de AV multithread
Esse aviso indica que um thread tem potencial para acessar objetos excluídos se for preempitado.
Comentários
Não deve haver acesso a um objeto contado por referência depois que a contagem de referência estiver em zero.
Nome da análise de código: INTERLOCKEDDECREMENT_MISUSE1
Exemplo
O código a seguir gera esse aviso. Este é um exemplo de sequência de tempo de threading que pode expor esse problema. Neste exemplo, m_cRef
é um membro de this
:
Um thread T1 executa a if
condição, diminui m_cRef
para 1 e, em seguida, é preempto.
Outro thread T2 executa a if
condição, diminui m_cRef
para 0, executa o if
corpo (onde this
é excluído) e retorna NULL
.
Quando T1 for reagendado, ele fará referência m_cref
na linha 9. Assim, ele acessará uma variável de membro depois que o ponteiro relacionado this
tiver sido excluído e quando o heap do objeto estiver em um estado desconhecido.
ULONG CObject::Release()
{
if (0 == InterlockedDecrement(&m_cRef))
{
delete this;
return NULL;
}
/* this.m_cRef isn't thread safe */
return m_cRef;
}
O código a seguir não faz referência a nenhuma memória de heap depois que o objeto é excluído.
ULONG CObject::Release()
{
ASSERT(0 != m_cRef);
ULONG cRef = InterlockedDecrement(&m_cRef);
if (0 == cRef)
{
delete this;
return NULL;
}
return cRef;
}