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


Предупреждение C26403

Сброс или явное удаление указателя owner<T> "переменная" (r.3)

Указатели владельца похожи на уникальные указатели: они принадлежат исключительно ресурсу и управляют выпуском ресурса или его передаче другим владельцам. Эта проверка проверяет, правильно ли указатель локального владельца поддерживает свой ресурс через все пути выполнения в функции. Если ресурс не был передан другому владельцу или не был явно выпущен, средство проверки предупреждает и указывает на объявление переменной указателя.

Дополнительные сведения см. в основных рекомендациях по C++ .

Замечания

  • В настоящее время эта проверка не дает точного пути, который не может освободить ресурс. Это поведение может быть улучшено в будущих выпусках. Возможно, трудно найти точное расположение для исправления. Лучший подход заключается в том, чтобы попытаться заменить обычные указатели в сложных функциях уникальными указателями, чтобы избежать каких-либо рисков.

  • Проверка может отменить сверхсложную функцию, чтобы не блокировать анализ кода. Как правило, сложность функций должна поддерживаться под некоторым разумным пороговым значением. Мы можем рассмотреть вопрос о добавлении локальной проверки сложности в модуль основных рекомендаций C++, если для него есть четкий спрос. Это ограничение применимо к другим правилам, которые чувствительны к потоку данных.

  • Предупреждение может возникать в явно ложных положительных случаях, когда память удаляется только после проверки null указателя. Эти ложные срабатывания являются результатом текущего ограничения API средства, но его можно улучшить в будущем.

Имя анализа кода: RESET_OR_DELETE_OWNER

Пример

Отсутствует очистка во время обработки ошибок:

gsl::owner<int*> sequence = GetRandomSequence(); // C26403

try
{
    StartSimulation(sequence);
}
catch (const std::exception& e)
{
    if (KnownException(e))
        return; // Skipping the path which deletes the owner.

    ReportException(e);
}

delete [] sequence;