Поделиться через


Предупреждение 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;
}