Aracılığıyla paylaş


Uyarı C26411

'parameter' parametresi benzersiz işaretçiye başvurudur ve hiçbir zaman yeniden atanmaz veya sıfırlanması, kullanılması T* veya T& bunun yerine (r.33)

Bir işleve başvuruya göre benzersiz bir işaretçi geçirdiğinizde, kaynağın işlev içinde serbest bırakılabileceği veya aktarılabileceği anlamına gelir. İşlev yalnızca kaynağa erişmek için parametresini kullanıyorsa, ham bir işaretçi veya başvuru geçirmek güvenlidir. Daha fazla bilgi için bkz . C++ Temel Yönergeler kuralı R.33: bir işlevin<pencere öğesini yeniden açdığını ifade etmek için unique_ptr pencere> öğesi ve parametresi alma.

Açıklamalar

  • C26410 uyarısından kaynaklanan sınırlamalar burada da geçerlidir.

  • Benzersiz işaretçiyi algılamak release veya reset bu işaretçiye erişmek için buluşsal özellik saftır. Yalnızca atama işleçlerine ve adlı reset işlevlere yapılan çağrıları algılarız (büyük/küçük harfe duyarsız). Bu algılama, akıllı işaretçi değişikliklerinin olası tüm durumlarını kapsamaz. (Örneğin, özel bir akıllı işaretçide öğesini veya özel işlev olmayanconst herhangi bir işlevi algılamazstd::swap). Bu uyarının özel türlerde ve standart benzersiz işaretçilerle ilgili bazı senaryolarda birçok hatalı pozitif sonuç üretmesini bekliyoruz. Akıllı işaretçilere odaklanan daha fazla denetim uyguladığımız için buluşsal yöntemleri geliştirmeyi bekliyoruz.

  • Akıllı işaretçilerin genellikle şablon olması ilginç bir sınırlama getirir. Kullanılmadıysa, şablon kodunu şablonlarda işlemek için derleyici gerekli değildir. Akıllı işaretçi arabirimlerini sınırlı kullanan kodda, denetleyici beklenmeyen sonuçlar üretebilir. Bazı işlevler hiçbir zaman kullanılmayabileceği için denetleyici şablon türünün semantiğini düzgün bir şekilde belirleyemiyor. standart std::unique_ptriçin, türün adı tanınarak bu sınırlama azaltılır. Bu analiz gelecekte daha iyi bilinen akıllı işaretçileri kapsayacak şekilde genişletilebilir.

  • Örtük başvuruya göre yakalama işlemi gerçekleştiren Lambda ifadeleri, benzersiz işaretçilere yapılan başvurular hakkında şaşırtıcı uyarılara yol açabilir. Şu anda, lambdalarda yakalanan tüm başvuru parametreleri sıfırlanıp sıfırlanmadığına bakılmaksızın bildirilir. Gelecekteki bir sürüm, lambda alanlarıyla lambda parametrelerini ilişkilendirmek için buluşsal yaklaşımı genişletebilir.

Kod analizi adı: NO_REF_TO_UNIQUE_PTR

Örnek: Gereksiz başvuru

void TraceValid(std::unique_ptr<Slot> &slot)    // C26411
{
    if (!IsDamaged(slot.get()))
        std::cout << *slot.get();
}

void ReleaseValid(std::unique_ptr<Slot> &slot)  // OK
{
    if (!IsDamaged(slot.get()))
        slot.reset(nullptr);
}