Warnung C26431
Der Ausdruckstyp "Ausdruck" ist bereits
gsl::not_null
vorhanden. 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_null
ausgewertet 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;
}
//...