다음을 통해 공유


경고 C28616

다중 스레드 AV 조건

이 경고는 스레드가 선점된 경우 삭제된 개체에 액세스할 가능성이 있음을 나타냅니다.

설명

참조 수가 0이면 참조 개수 개체에 액세스할 수 없습니다.

코드 분석 이름: INTERLOCKEDDECREMENT_MISUSE1

예제

다음 코드는 이 경고를 생성합니다. 이는 이 문제를 노출할 수 있는 스레딩 시간 시퀀스의 예입니다. 이 예제에서 는 m_cRefthis멤버입니다.

스레드 T1은 if 조건을 실행하고 1로 감소 m_cRef 한 다음 선점됩니다.

또 다른 스레드 T2는 if 조건을 실행하고, 0으로 감소 m_cRef 하고, 본문(여기서 this 는 삭제됨)을 실행하고 if 를 반환합니다NULL.

T1이 다시 예약되면 9줄에서 참조 m_cref 됩니다. 따라서 관련 this 포인터가 삭제된 후 및 개체의 힙이 알 수 없는 상태일 때 멤버 변수에 액세스합니다.

ULONG CObject::Release()
{
    if (0 == InterlockedDecrement(&m_cRef))
    {
        delete this;
        return NULL;
    }
    /* this.m_cRef isn't thread safe */
    return m_cRef;
}

다음 코드는 개체가 삭제된 후 힙 메모리를 참조하지 않습니다.

ULONG CObject::Release()
{
    ASSERT(0 != m_cRef);
    ULONG cRef = InterlockedDecrement(&m_cRef);
    if (0 == cRef)
    {
        delete this;
        return NULL;
    }
    return cRef;
}