Предупреждение C28616
Условие многопоточного антивирусного приложения
Это предупреждение указывает, что поток может получить доступ к удаленным объектам, если он вытеснен.
Комментарии
После того, как число ссылок равно нулю, доступ к объекту со счетчиком ссылок не должен быть.
Имя анализа кода: INTERLOCKEDDECREMENT_MISUSE1
Пример
Следующий код создает это предупреждение. Это пример последовательности времени потоков, которая может выявить эту проблему. В этом примере m_cRef
является членом :this
Поток T1 выполняет if
условие, уменьшается m_cRef
до 1, а затем вытесняется.
Другой поток T2 выполняет if
условие, уменьшается m_cRef
до 0, выполняет if
тело (где this
удаляется) и возвращает NULL
.
При переносе расписания T1 он будет ссылаться m_cref
на строку 9. Таким образом, он будет обращаться к переменной-члену после удаления связанного 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;
}