Warnung C26403

Zurücksetzen oder explizit löschen einer owner<T> Zeigervariablen (r.3)

Besitzerzeiger sind wie eindeutige Zeiger: Sie besitzen eine Ressource exklusiv und verwalten die Freigabe der Ressource oder ihre Übertragungen an andere Besitzer. Diese Überprüfung überprüft, ob ein lokaler Besitzerzeiger ordnungsgemäß Standard seine Ressource über alle Ausführungspfade in einer Funktion aufhält. Wenn die Ressource nicht an einen anderen Besitzer übertragen wurde oder nicht explizit freigegeben wurde, warnt die Prüfer und verweist auf die Deklaration der Zeigervariable.

Weitere Informationen finden Sie in den C++-Kernrichtlinien.

Hinweise

  • Derzeit gibt diese Überprüfung nicht den genauen Pfad an, der die Ressource nicht freigeben kann. Dieses Verhalten kann in zukünftigen Versionen verbessert werden. Es kann schwierig sein, den genauen Ort für einen Fix zu finden. Der bessere Ansatz besteht darin, einfache Zeiger in komplexen Funktionen durch eindeutige Zeiger zu ersetzen, um Risiken zu vermeiden.

  • Die Überprüfung kann eine überkomplizierte Funktion aufheben Karte um die Codeanalyse nicht zu blockieren. Im Allgemeinen sollte die Komplexität von Funktionen unter einem angemessenen Schwellenwert Standard beibehalten werden. Es kann in Erwägung gezogen werden, dem Modul "C++-Kernrichtlinien" eine lokale Komplexitätsprüfung hinzuzufügen, wenn dies eindeutig erforderlich ist. Diese Einschränkung gilt für andere Regeln, die für den Datenfluss vertraulich sind.

  • Die Warnung kann auf eindeutig falsch positive Fälle ausgelöst werden, in denen der Speicher erst nach der NULL-Überprüfung eines Zeigers gelöscht wird. Diese falsch positiven Ergebnisse sind das Ergebnis einer aktuellen Einschränkung der API des Tools, aber es kann in Zukunft verbessert werden.

Codeanalysename: RESET_OR_DELETE_OWNER

Beispiel

Fehlende sauber up während der Fehlerbehandlung:

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;