Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
Az "expr" kifejezés típusa már
gsl::not_nulllétezik. Ne tesztelje null értékre (f.23)
C++ alapvető irányelvek: F.23: Not_null T> használatával<jelezheti, hogy a "null" nem érvényes érték
Az Irányelvek támogatási kódtár jelölőtípusa gsl::not_null egyértelműen jelzi azokat az értékeket, amelyek soha nem nullmutatók. Ez akkor okoz súlyos hibát, ha a feltételezés nem áll meg futásidőben. Így nyilvánvalóan nem kell null értéket keresni, ha egy kifejezés típus gsl::not_nulleredményeként értékel.
Megjegyzések
Mivel gsl::not_null maga egy vékony mutatóburkoló osztály, a szabály valójában nyomon követi azokat az ideiglenes változókat, amelyek a túlterhelt konverziós operátor felé irányuló hívásokból származó eredményeket tartalmazzák (amelyek tartalmazott mutatóobjektumokat adnak vissza). Az ilyen logika ezt a szabályt olyan kifejezésekre teszi alkalmazhatóvá, amelyek változókat is magukban foglalnak, és amelyek végül a gsl::not_null típus eredményével rendelkeznek. Jelenleg azonban kihagyja azokat a kifejezéseket, amelyek függvényhívásokat gsl::not_nulltartalmaznak.
A null ellenőrzések jelenlegi heurisztikus értéke a következő kontextusokat észleli:
- egy szimbólumkifejezés egy ágfeltételben, például
if (p) { ... }; - nem bitenkénti logikai műveletek;
- összehasonlító műveletek, ahol az egyik operandus egy állandó kifejezés, amely nullára értékel.
Kódelemzés neve: DONT_TEST_NOTNULL.
példa
A szükségtelen null ellenőrzések megkérdőjelezhető logikát fednek fel:
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!
}
//...
};
A szükségtelen null ellenőrzések megkérdőjelezhető logikát fednek fel, átdolgozva:
//...
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;
}
//...