Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Условие многопоточного антивирусного приложения
Это предупреждение указывает, что поток может получить доступ к удаленным объектам, если он вытеснен.
Комментарии
После того, как число ссылок равно нулю, доступ к объекту со счетчиком ссылок не должен быть.
Имя анализа кода: 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;
}