Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Сброс или явное удаление указателя
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;