Freigeben über


Warnung C26431

Der Ausdruckstyp "Ausdruck" ist bereits gsl::not_nullvorhanden. Testen Sie sie nicht auf Nullwert (f.23)

C++-Kernrichtlinien: F.23: Verwenden Sie einen not_null<T> , um anzugeben, dass "null" kein gültiger Wert ist.

Der Markierungstyp gsl::not_null aus der Richtlinienunterstützungsbibliothek wird verwendet, um eindeutig Werte anzugeben, die niemals NULL-Zeiger sind. Dies führt zu einem schwierigen Fehler, wenn die Annahme zur Laufzeit nicht gehalten wird. Es ist also offensichtlich nicht erforderlich, nach NULL zu suchen, wenn ein Ausdruck als Ergebnis des Typs gsl::not_nullausgewertet wird.

Hinweise

Da gsl::not_null es sich selbst um eine dünne Zeigerwrapperklasse handelt, verfolgt die Regel tatsächlich temporäre Variablen, die Ergebnisse von Aufrufen des überladenen Konvertierungsoperators enthalten (die enthaltene Zeigerobjekte zurückgibt). Eine solche Logik macht diese Regel für Ausdrücke anwendbar, die Variablen umfassen und letztendlich ein Ergebnis des gsl::not_null Typs haben. Es überspringt jedoch derzeit Ausdrücke, die Funktionsaufrufe enthalten, die zurückgegeben werden gsl::not_null.

Die aktuelle Heuristik für NULL-Prüfungen erkennt die folgenden Kontexte:

  • ein Symbolausdruck in einer Verzweigungsbedingung, z. B if (p) { ... }. ;
  • nicht bitweise logische Vorgänge;
  • Vergleichsvorgänge, bei denen ein Operand ein konstanter Ausdruck ist, der als Null ausgewertet wird.

Codeanalysename: DONT_TEST_NOTNULL

Beispiel

Unnötige NULL-Prüfungen zeigen fragwürdige Logik an:

class type {
public:
    template<class T> bool is() const;
    template<class T> gsl::not_null<const T*> as() const;
    //...
};

class alias_type : public type {
public:
    gsl::not_null<const type*> get_underlying_type() const;
    gsl::not_null<const type*> get_root_type() const
    {
        const auto ut = get_underlying_type();
        if (ut)                                     // C26431
        {
            const auto uat = ut->as<alias_type>();
            if (uat)                                // C26431, also incorrect use of API!
                return uat->get_root_type();

            return ut;
        }

        return this;                                // Alias to nothing? Actually, dead code!
    }
    //...
};

Unnötige NULL-Prüfungen zeigen fragwürdige Logik, überarbeitet:

    //...
    gsl::not_null<const type*> get_root_type() const
    {
        const auto ut = get_underlying_type();
        if (ut->is<alias_type>())
            return ut->as<alias_type>()->get_root_type();

        return ut;
    }
    //...