Upozornění C26411
Parametr 'parameter' je odkaz na jedinečný ukazatel a nikdy se znovu nepřiřazuje nebo resetuje, použijte
T*
neboT&
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
neboreset
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ázvemreset
(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 nedetekujestd::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_ptr
se 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);
}