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


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