Bagikan melalui


Peringatan C26431

Jenis ekspresi 'expr' sudah gsl::not_null. Jangan mengujinya untuk nullness (f.23)

Pedoman Inti C++: F.23: Gunakan not_null<T> untuk menunjukkan bahwa "null" bukan nilai yang valid

Jenis gsl::not_null penanda dari Pustaka Dukungan Pedoman digunakan untuk menunjukkan nilai yang tidak pernah null pointer dengan jelas. Ini menyebabkan kegagalan keras jika asumsi tidak tahan pada waktu proses. Jadi, jelas, tidak perlu memeriksa null jika ekspresi mengevaluasi ke hasil jenis gsl::not_null.

Keterangan

Karena gsl::not_null itu sendiri adalah kelas pembungkus pointer tipis, aturan sebenarnya melacak variabel sementara yang menyimpan hasil dari panggilan ke operator konversi yang kelebihan beban (yang mengembalikan objek pointer yang berisi). Logika tersebut membuat aturan ini berlaku untuk ekspresi yang melibatkan variabel dan akhirnya memiliki hasil dari jenis tersebut gsl::not_null . Namun, saat ini melewati ekspresi yang berisi panggilan fungsi yang mengembalikan gsl::not_null.

Heuristik saat ini untuk pemeriksaan null mendeteksi konteks berikut:

  • ekspresi simbol dalam kondisi cabang, misalnya if (p) { ... };
  • operasi logis non-bitwise;
  • operasi perbandingan di mana satu operand adalah ekspresi konstanta yang mengevaluasi ke nol.

Nama analisis kode: DONT_TEST_NOTNULL

Contoh

Pemeriksaan null yang tidak perlu mengungkapkan logika yang dipertanyakan:

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

Pemeriksaan null yang tidak perlu mengungkapkan logika yang dipertanyakan, dikerjakan ulang:

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