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