Upozornění C26400
Nepřiřazujte výsledek přidělení nebo volání funkce s návratovou
owner<T>
hodnotou nezpracovaným ukazatelem, použijteowner<T>
místo toho (i.11).
Poznámky
Tato kontrola pomáhá vynutit *pravidlo I.11: Nikdy nepřevést vlastnictví nezpracovaným ukazatelem (T*), což je podmnožina pravidla R.3: Nezpracovaný ukazatel (T*) není vlastněný. Konkrétně varuje při každém volání operator new
, který ukládá svůj výsledek do proměnné nezpracovaného typu ukazatele. Upozorňuje také na volání funkcí, které se vrátí gsl::owner<T>
, pokud jsou jejich výsledky přiřazeny k nezpracovaným ukazatelům. Myšlenka spočívá v tom, že byste měli jasně uvést vlastnictví paměťových prostředků. Další informace najdete v pokynech pro C++ Core Guidelines.
Nejjednodušší způsob, jak toto upozornění opravit, je použít auto
deklaraci, pokud je prostředek přiřazen okamžitě k deklaraci proměnné. Pokud tato oprava není možná, doporučujeme použít typ gsl::owner<T>
. Deklarace auto
inicializované pomocí operátoru new
jsou "vlastníci", protože předpokládáme, že výsledek jakéhokoli přidělení je implicitně ukazatel vlastníka. Tento předpoklad přeneseme do auto
proměnné a považujeme ji za owner<T>
.
Pokud tato kontrola označí volání funkce, která vrací owner<T>
, může to být označení legitimní chyby v kódu. V podstatě odkazuje na místo, kde kód nevrací explicitní pojem vlastnictví (a možná samotný prostředek).
Toto pravidlo aktuálně kontroluje pouze místní proměnné. Pokud přiřadíte přidělení formálnímu parametru, globální proměnné, členu třídy atd., nebude označen příznakem. Vhodné pokrytí takových scénářů je naplánováno pro budoucí práci.
Název analýzy kódu: NO_RAW_POINTER_ASSIGNMENT
Příklad 1: Jednoduché přidělení
char *buffer = nullptr;
if (useCache)
buffer = GetCache();
else
buffer = new char[bufferSize]; // C26400
Příklad 2: Jednoduché přidělení (opraveno gsl::owner<T>
)
gsl::owner<char*> buffer = nullptr;
if (useCache)
buffer = GetCache();
else
buffer = new char[bufferSize]; // OK
Příklad 3: Jednoduché přidělení (opraveno auto
)
auto buffer = useCache ? GetCache() : new char[bufferSize]; // OK