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_null
bir 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_null
iş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;
}
//...
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin