Sdílet prostřednictvím


Upozornění C26403

Resetování nebo explicitní odstranění owner<T> ukazatele proměnné (r.3)

Ukazatele vlastníka jsou podobné jedinečným ukazatelům: vlastní výhradně prostředek a spravují uvolnění prostředku nebo jeho přenosy jiným vlastníkům. Tato kontrola ověří, že místní ukazatel vlastníka správně udržuje svůj prostředek prostřednictvím všech cest spuštění ve funkci. Pokud se prostředek nepřenesl na jiného vlastníka nebo nebyl explicitně vydaný, checker varuje a odkazuje na deklaraci proměnné ukazatele.

Další informace najdete v pokynech pro C++ Core Guidelines.

Poznámky

  • V současné době tato kontrola neposkytuje přesnou cestu, která se nepovede uvolnit prostředek. Toto chování se může v budoucích verzích zlepšit. Může být obtížné najít přesné umístění opravy. Lepším přístupem je pokusit se nahradit prosté ukazatele ve složitých funkcích jedinečnými ukazateli, abyste se vyhnuli rizikům.

  • Kontrola může zahodit příliš složitou funkci, aby neblokovala analýzu kódu. Obecně platí, že složitost funkcí by měla být zachována pod určitou rozumnou prahovou hodnotou. Můžeme zvážit přidání kontroly místní složitosti do modulu C++ Core Guidelines, pokud je pro něj jasná poptávka. Toto omezení platí pro další pravidla citlivá na tok dat.

  • Upozornění se může aktivovat jasně falešně pozitivní případy, kdy se paměť odstraní až po kontrole hodnoty null ukazatele. Tyto falešně pozitivní výsledky jsou výsledkem aktuálního omezení rozhraní API nástroje, ale v budoucnu se může zlepšit.

Název analýzy kódu: RESET_OR_DELETE_OWNER

Příklad

Během zpracování chyb chybí vyčištění:

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;