Aracılığıyla paylaş


Uyarı C26403

'owner<T>' işaretçisini sıfırlama veya açıkça silme (r.3)

Sahip işaretçileri benzersiz işaretçiler gibidir: bir kaynağa özel olarak sahip olurlar ve kaynağın yayınını veya diğer sahiplere aktarımlarını yönetirler. Bu denetim, yerel sahip işaretçinin bir işlevdeki tüm yürütme yolları aracılığıyla kaynağını düzgün şekilde koruduğunu doğrular. Kaynak başka bir sahipe aktarılmış veya açıkça serbest bırakılmamışsa, denetleyici uyarır ve işaretçi değişkeninin bildirimine işaret eder.

Daha fazla bilgi için bkz . C++ Çekirdek Yönergeleri.

Açıklamalar

  • Şu anda bu denetim kaynağı serbest bırakamıyor tam yolu vermiyor. Bu davranış, gelecek sürümlerde geliştirilebilir. Bir düzeltme için tam konumu bulmak zor olabilir. Daha iyi bir yaklaşım, herhangi bir riskten kaçınmak için karmaşık işlevlerdeki düz işaretçileri benzersiz işaretçilerle değiştirmeyi denemektir.

  • Denetim, kod analizini engellememek için aşırı karmaşık bir işlevi atabilir. Genellikle işlevlerin karmaşıklığı makul bir eşik altında tutulmalıdır. Net bir talep varsa C++ Çekirdek Yönergeleri modülüne yerel bir karmaşıklık denetimi eklemeyi göz önünde bulundurabiliriz. Bu sınırlama, veri akışına duyarlı olan diğer kurallar için geçerlidir.

  • Uyarı, belleğin yalnızca işaretçinin null denetiminden sonra silindiği açıkça yanlış pozitif durumlarda tetiklenebilir. Bu hatalı pozitif sonuçlar, aracın API'sinin geçerli bir sınırlamasının sonucu olur, ancak gelecekte geliştirilebilir.

Kod analizi adı: RESET_OR_DELETE_OWNER

Örnek

Hata işleme sırasında eksik temizleme:

gsl::owner<int*> sequence = GetRandomSequence(); // C26403

try
{
    StartSimulation(sequence);
}
catch (const std::exception& e)
{
    if (KnownException(e))
        return; // Skipping the path which deletes the owner.

    ReportException(e);
}

delete [] sequence;