Aracılığıyla paylaş


Uyarı C26431

'expr' ifadesinin türü zaten gsl::not_nullşeklindedir. Null (f.23) için test etmeyin

C++ Temel Yönergeleri: F.23: "null" değerinin geçerli bir değer olmadığını belirtmek için not_null<T> kullanın

Kılavuz Desteği Kitaplığı'ndan işaretçi türü gsl::not_null , hiçbir zaman null işaretçi olmayan değerleri açıkça belirtmek için kullanılır. Varsayım çalışma zamanında tutmazsa zor bir hataya neden olur. Bu nedenle, bir ifadenin türünde gsl::not_nullbir sonuç olarak değerlendirip değerlendirmediğinin null olup olmadığını denetlemeye gerek olmadığı açıktır.

Açıklamalar

Kendisi ince bir işaretçi sarmalayıcı sınıfı olduğundan gsl::not_null , kural aslında aşırı yüklenmiş dönüştürme işlecine yapılan çağrılardan (içeren işaretçi nesnelerini döndüren) sonuçları tutan geçici değişkenleri izler. Bu tür bir mantık, bu kuralı değişkenleri içeren ve sonunda türün gsl::not_null sonucuna sahip olan ifadeler için geçerli hale getirir. Ancak, şu anda döndüren gsl::not_nullişlev çağrılarını içeren ifadeleri atlar.

Null denetimler için geçerli buluşsal yöntemler aşağıdaki bağlamları algılar:

  • dal koşulundaki bir simge ifadesi; örneğin if (p) { ... };
  • bit düzeyinde olmayan mantıksal işlemler;
  • bir işlenenin sıfır olarak değerlendirilen sabit bir ifade olduğu karşılaştırma işlemleri.

Kod analizi adı: DONT_TEST_NOTNULL

Örnek

Gereksiz null denetimler sorgulanabilir mantığı ortaya çıkar:

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

Gereksiz null denetimler, sorgulanabilir mantığı ortaya çıkararak yeniden çalışıldı:

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