Megosztás:


Figyelmeztetés C26431

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;
    }
    //...