Warnung C26411
Der Parameter "parameter" ist ein Verweis auf einen eindeutigen Zeiger und wird nie neu zugewiesen oder zurückgesetzt, verwendet
T*
oderT&
stattdessen (r.33)
Wenn Sie einen eindeutigen Zeiger per Verweis an eine Funktion übergeben, bedeutet dies, dass seine Ressource innerhalb der Funktion freigegeben oder übertragen werden kann. Wenn die Funktion ihren Parameter nur für den Zugriff auf die Ressource verwendet, ist es sicher, einen unformatierten Zeiger oder einen Verweis zu übergeben. Weitere Informationen finden Sie unter C++ Core Guidelines rule R.33: Take a unique_ptr<widget>& parameter to express that a function reseat the widget.
Hinweise
Die Einschränkungen der Warnung C26410 gelten auch hier.
Die Heuristik zum Erkennen
release
oderreset
Zugreifen auf den einzigartigen Zeiger ist naiv. Wir erkennen nur Aufrufe von Zuordnungsoperatoren und funktionen namensreset
"Groß-/Kleinschreibung". Offensichtlich deckt diese Erkennung nicht alle möglichen Fälle intelligenter Zeigeränderungen ab. (Sie erkenntstd::swap
z. B. keine spezielle Nichtfunktionconst
in einem benutzerdefinierten intelligenten Zeiger). Wir erwarten, dass diese Warnung viele falsch positive Ergebnisse für benutzerdefinierte Typen und in einigen Szenarien mit standardspezifischen Zeigern erzeugt. Wir erwarten, dass wir die Heuristik verbessern, da wir mehr Prüfungen implementieren, die auf intelligente Zeiger ausgerichtet sind.Die Tatsache, dass intelligente Zeiger häufig Vorlagen sind, bringt eine interessante Einschränkung. Der Compiler ist nicht erforderlich, um Vorlagencode in Vorlagen zu verarbeiten, wenn er nicht verwendet wird. In Code, der die Verwendung intelligenter Zeigerschnittstellen beschränkt, kann die Prüfer unerwartete Ergebnisse erzielen. Die Überprüfung kann die Semantik des Vorlagentyps nicht ordnungsgemäß identifizieren, da einige Funktionen möglicherweise nie verwendet werden. Für den Standard
std::unique_ptr
wird diese Einschränkung verringert, indem der Name des Typs erkannt wird. Diese Analyse kann in Zukunft erweitert werden, um bekanntere intelligente Zeiger abzudecken.Lambda-Ausdrücke, die implizite Aufzeichnungen nach Verweis ausführen, können zu überraschenden Warnungen über Verweise auf eindeutige Zeiger führen. Derzeit werden alle erfassten Referenzparameter in Lambdas gemeldet, unabhängig davon, ob sie zurückgesetzt werden oder nicht. Eine zukünftige Version kann die Heuristik erweitern, um Lambda-Felder und Lambda-Parameter zu korrelieren.
Codeanalysename: NO_REF_TO_UNIQUE_PTR
Beispiel: Unnötiger Verweis
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);
}