Предупреждение C26411
Параметр "параметр" является ссылкой на уникальный указатель, и он никогда не переназначен или сбрасывается, используется
T*
илиT&
вместо него (r.33)
При передаче уникального указателя на функцию по ссылке он подразумевает, что его ресурс может быть освобожден или передан внутри функции. Если функция использует его параметр только для доступа к ресурсу, это безопасно для передачи необработанного указателя или ссылки. Дополнительные сведения см. в правиле R.33 основных рекомендаций C++: примите параметр мини-приложения unique_ptr<, чтобы выразить, что функция повторно перепродает мини-приложение>.
Замечания
Здесь также применимы ограничения предупреждения C26410 .
Эвристика для обнаружения
release
илиreset
доступа к уникальному указателю наивна. Мы обнаруживаем только вызовы операторов назначения и функций с именемreset
(без учета регистра). Очевидно, что это обнаружение не охватывает все возможные случаи изменения смарт-указателя. (Например, он не обнаруживаетstd::swap
никаких специальных функций, отличныхconst
от функции в пользовательском интеллектуальном указателе. Мы ожидаем, что это предупреждение может привести к множеству ложных срабатываний для пользовательских типов и в некоторых сценариях, связанных со стандартными уникальными указателями. Мы ожидаем улучшения эвристики, так как мы реализуем дополнительные проверки, ориентированные на умные указатели.Тот факт, что умные указатели часто шаблоны являются интересным ограничением. Компилятор не требуется обрабатывать код шаблона в шаблонах, если он не используется. В коде, который ограничивает использование интерфейсов смарт-указателя, средство проверки может привести к непредвиденным результатам. Средство проверки не может правильно определить семантику типа шаблона, так как некоторые функции никогда не используются. Для стандартного
std::unique_ptr
ограничения это ограничение устраняется путем распознавания имени типа. Этот анализ может быть расширен в будущем, чтобы охватывать более известные умные указатели.Лямбда-выражения, которые делают неявную запись по ссылке, могут привести к удивительным предупреждениям о ссылках на уникальные указатели. В настоящее время все захваченные ссылочные параметры в лямбда-файлах сообщаются независимо от того, сбрасываются ли они или нет. Будущий выпуск может расширить эвристические возможности для сопоставления лямбда-полей и лямбда-параметров.
Имя анализа кода: NO_REF_TO_UNIQUE_PTR
Пример: ненужная ссылка
void TraceValid(std::unique_ptr<Slot> &slot) // C26411
{
if (!IsDamaged(slot.get()))
std::cout << *slot.get();
}
void ReleaseValid(std::unique_ptr<Slot> &slot) // OK
{
if (!IsDamaged(slot.get()))
slot.reset(nullptr);
}