Partilhar via


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