경고 C28616
다중 스레드 AV 조건
이 경고는 스레드가 선점된 경우 삭제된 개체에 액세스할 가능성이 있음을 나타냅니다.
설명
참조 수가 0이면 참조 개수 개체에 액세스할 수 없습니다.
코드 분석 이름: INTERLOCKEDDECREMENT_MISUSE1
예제
다음 코드는 이 경고를 생성합니다. 이는 이 문제를 노출할 수 있는 스레딩 시간 시퀀스의 예입니다. 이 예제에서 는 m_cRef
의 this
멤버입니다.
스레드 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;
}