Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
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;
}