Warnung C26430
Das Symbol wird nicht auf Nullwerte für alle Pfade getestet.
C++-Kernrichtlinien: F.23: Verwenden Sie einen not_null<T> , um anzugeben, dass "null" kein gültiger Wert ist.
Wenn code jemals Zeigervariablen auf NULL überprüft, sollte dies auf allen Pfaden konsistent und überprüft werden. Manchmal ist die überaggressive Überprüfung auf NULL immer noch besser als die Möglichkeit eines harten Absturzes in einem der komplizierten Verzweigungen. Im Idealfall sollte dieser Code so umgestaltet werden, dass er weniger komplex ist (indem er in mehrere Funktionen aufgeteilt wird) und auf Markierungen wie gsl::not_null
. Diese Markierungen ermöglichen es dem Code, Teile des Algorithmus zu isolieren, die sichere Annahmen zu gültigen Zeigerwerten machen können. Die Regel TEST_ON_ALL_PATHS
hilft dabei, Orte zu finden, an denen NULL-Prüfungen inkonsistent sind (d. h. Annahmen können eine Überprüfung erfordern). Oder es findet tatsächliche Fehler, bei denen ein potenzieller Nullwert NULL-Prüfungen in einigen Codepfaden umgehen kann.
Hinweise
Diese Regel erwartet, dass Code eine Zeigervariable ableiten soll, sodass eine NULL-Prüfung (oder Erzwingung eines Nicht-Null-Werts) gerechtfertigt wäre. Wenn keine Ableitung vorhanden ist, wird die Regel angehalten.
Die aktuelle Implementierung behandelt nur einfache Zeiger (oder ihre Aliase) und erkennt keine intelligenten Zeiger, auch wenn NULL-Prüfungen auch für intelligente Zeiger gelten.
Eine Variable wird als "null" markiert, wenn sie in den folgenden Kontexten verwendet wird:
- als Symbolausdruck in einer Verzweigungsbedingung, z. B. in
if (p) { ... }
; - in nicht bitweise logischen Vorgängen;
- in Vergleichsvorgängen, bei denen ein Operand ein konstanter Ausdruck ist, der als Null ausgewertet wird.
Die Regel hat keine vollständige Datenflussverfolgung. Es kann zu falschen Ergebnissen führen, wenn indirekte Prüfungen verwendet werden (z. B. wenn eine Zwischenvariable einen NULL-Wert enthält und später in einem Vergleich verwendet wird).
Implizite NULL-Prüfungen werden angenommen, wenn ein Zeigerwert zugewiesen wird:
- eine Zuordnung, die mit Wurf
operator new
durchgeführt wird; - ein zeiger, der von einem Typ abgerufen wurde, der mit
gsl::not_null
.
Beispiel
Inkonsistente Tests zeigen logikfehler an
void merge_states(const state *left, const state *right) // C26430
{
if (*left && *right)
converge(left, right);
else
{
// ...
if (!left && !right) // Logic error!
discard(left, right);
}
}
Inkonsistente Tests zeigen logikfehler - korrigiert
void merge_states(gsl::not_null<const state *> left, gsl::not_null<const state *> right)
{
if (*left && *right)
converge(left, right);
else
{
// ...
if (*left && *right)
discard(left, right);
}
}
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für