Freigeben über


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 newdurchgefü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);
    }
}