Warnung C26400

Weisen Sie das Ergebnis einer Zuordnung oder eines Funktionsaufrufs mit einem owner<T> Rückgabewert nicht einem unformatierten Zeiger zu. Verwenden Sie owner<T> stattdessen (i.11)

Hinweise

Diese Überprüfung hilft, die *Regel I.11 zu erzwingen: Den Besitz niemals durch einen unformatierten Zeiger (T*) übertragen, bei dem es sich um eine Teilmenge der Regel R.3 handelt: Ein unformatierter Zeiger (t*) ist nicht besitzbar. Insbesondere wird bei jedem Aufruf operator newgewarnt, bei dem das Ergebnis in einer Variablen vom unformatierten Zeigertyp gespeichert wird. Außerdem werden Aufrufe von Funktionen gewarnt, die zurückgegeben gsl::owner<T> werden, wenn ihre Ergebnisse unformatierten Zeigern zugewiesen sind. Die Idee ist, dass Sie eindeutig den Besitz von Speicherressourcen angeben sollten. Weitere Informationen finden Sie in den C++-Kernrichtlinien.

Die einfachste Möglichkeit, diese Warnung zu beheben, besteht darin, Deklaration zu verwenden auto , wenn die Ressource sofort an der Variablendeklaration zugewiesen wird. Wenn dieser Fix nicht möglich ist, empfehlen wir, den Typ gsl::owner<T>zu verwenden. Die auto mit dem Operator new initialisierten Deklarationen sind "Besitzer", da davon ausgegangen wird, dass das Ergebnis einer Zuordnung implizit ein Besitzerzeiger ist. Wir übertragen diese Annahme auf die auto Variable und behandeln sie als owner<T>.

Wenn durch diese Überprüfung ein Aufruf einer zurückgegebenen Funktion owner<T>gekennzeichnet wird, kann es ein Hinweis auf einen legitimen Fehler im Code sein. Im Grunde verweist er auf einen Ort, an dem der Code einen expliziten Begriff des Eigentums (und vielleicht die Ressource selbst) freigibt.

Diese Regel überprüft derzeit nur lokale Variablen. Wenn Sie einem formalen Parameter, einer globalen Variablen, einem Klassenmemmemb usw. eine Zuordnung zuweisen, wird sie nicht gekennzeichnet. Eine angemessene Abdeckung solcher Szenarien ist für zukünftige Arbeiten geplant.

Codeanalysename: NO_RAW_POINTER_ASSIGNMENT

Beispiel 1: Einfache Zuordnung

char *buffer = nullptr;
if (useCache)
    buffer = GetCache();
else
    buffer = new char[bufferSize];  // C26400

Beispiel 2: Einfache Zuordnung (fest mit gsl::owner<T>)

gsl::owner<char*> buffer = nullptr;
if (useCache)
    buffer = GetCache();
else
    buffer = new char[bufferSize];  // OK

Beispiel 3: Einfache Zuordnung (fest mit auto)

auto buffer = useCache ? GetCache() : new char[bufferSize]; // OK