Sdílet prostřednictvím


Upozornění C26411

Parametr 'parameter' je odkaz na jedinečný ukazatel a nikdy se znovu nepřiřazuje nebo resetuje, použijte T* nebo T& místo něj (r.33).

Když funkci předáte jedinečný ukazatel odkazem, znamená to, že jeho prostředek může být uvolněn nebo přenesen uvnitř funkce. Pokud funkce používá pro přístup k prostředku pouze jeho parametr, je bezpečné předat nezpracovaný ukazatel nebo odkaz. Další informace najdete v článku C++ Core Guidelines rule R.33: Pořiďte unique_ptr<widget a parametr,> který vyjadřuje, že funkce widget znovu naslouchá.

Poznámky

  • Omezení upozornění C26410 platí také zde.

  • Heuristické zjistit release nebo reset získat přístup k jedinečnému ukazateli je naivní. Rozpoznáme pouze volání operátorů přiřazení a funkcí s názvem reset (nerozlišují velká a malá písmena). Tato detekce samozřejmě nepokrývá všechny možné případy úprav inteligentního ukazatele. (Například nedetekuje std::swapžádnou speciální funkciconst , která není ve vlastním inteligentním ukazateli). Očekáváme, že toto upozornění může vést k mnoha falešně pozitivním výsledkům u vlastních typů a v některých scénářích se standardními jedinečnými ukazateli. Očekáváme, že vylepšíme heuristika, protože implementujeme více kontrol zaměřených na inteligentní ukazatele.

  • Skutečnost, že inteligentní ukazatele jsou často šablony přináší zajímavé omezení. Kompilátor se nevyžaduje ke zpracování kódu šablony v šablonách, pokud se nepoužívá. V kódu, který omezuje použití rozhraní inteligentních ukazatelů, může kontrola vést k neočekávaným výsledkům. Kontrola nemůže správně identifikovat sémantiku typu šablony, protože některé funkce se nemusí nikdy použít. U standardu std::unique_ptrse toto omezení zmírní tím, že rozpozná název typu. Tato analýza se může v budoucnu rozšířit tak, aby zahrnovala více známých inteligentních ukazatelů.

  • Výrazy lambda, které umožňují implicitní zachycení odkazu, můžou vést k překvapivým upozorněním na odkazy na jedinečné ukazatele. V současné době jsou všechny zachycené referenční parametry v lambda hlášeny bez ohledu na to, jestli se resetují nebo ne. Budoucí verze může heuristiku rozšířit tak, aby korelovala pole lambda a parametry lambda.

Název analýzy kódu: NO_REF_TO_UNIQUE_PTR

Příklad: Nepotřebný odkaz

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);
}