Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Условие многопоточного антивирусного приложения
Это предупреждение указывает, что поток может получить доступ к удаленным объектам, если он вытеснен.
Комментарии
После того, как число ссылок равно нулю, доступ к объекту со счетчиком ссылок не должен быть.
Имя анализа кода: 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;
}