Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Bir ayırmanın veya dönüş değeri olan
owner<T>bir işlev çağrısının sonucunu ham işaretçiye atamayın, bunun yerine kullanınowner<T>(örn. 11)
Açıklamalar
Bu denetim, *kural I.11: R.3 kuralının alt kümesi olan bir ham işaretçi (T*) ile sahipliği hiçbir zaman aktarmamaya yardımcı olur: Ham işaretçi (T*) sahip değildir. Özellikle, sonucunu ham işaretçi türündeki bir değişkene operator newkaydeden herhangi bir çağrısında uyarır. Ayrıca, sonuçları ham işaretçilere atandığında döndüren gsl::owner<T> işlevlere yapılan çağrılarda uyarır. Burada fikir, bellek kaynaklarının sahipliğini açıkça belirtmelisiniz. Daha fazla bilgi için bkz . C++ Çekirdek Yönergeleri.
Bu uyarıyı düzeltmenin en kolay yolu, kaynak değişken bildiriminde hemen atanırsa bildirimi kullanmaktır auto . Bu düzeltme mümkün değilse türünü gsl::owner<T>kullanmanızı öneririz.
auto herhangi bir ayırmanın sonucunun örtük olarak sahip işaretçisi olduğunu varsaydığımız için işleç new ile başlatılan bildirimler "sahipler"dir. Bu varsayımı değişkenine auto aktarıp olarak owner<T>ele alıyoruz.
Bu denetim, döndüren owner<T>bir işlev çağrısına bayrak eklerse, kodda geçerli bir hatanın göstergesi olabilir. Temel olarak, kodun açıkça sahiplik (ve belki kaynağın kendisi) sızdırdığı bir yere işaret eder.
Bu kural şu anda yalnızca yerel değişkenleri denetler. Resmi bir parametreye, genel değişkene, sınıf üyesine vb. ayırma atarsanız, buna bayrak eklenmez. Gelecekteki çalışmalar için bu tür senaryoların uygun kapsamı planlanır.
Kod analizi adı: NO_RAW_POINTER_ASSIGNMENT
Örnek 1: Basit ayırma
char *buffer = nullptr;
if (useCache)
buffer = GetCache();
else
buffer = new char[bufferSize]; // C26400
Örnek 2: Basit ayırma (ile gsl::owner<T>düzeltildi)
gsl::owner<char*> buffer = nullptr;
if (useCache)
buffer = GetCache();
else
buffer = new char[bufferSize]; // OK
Örnek 3: Basit ayırma (ile autodüzeltildi)
auto buffer = useCache ? GetCache() : new char[bufferSize]; // OK