Uyarı C26441
Guard nesneleri adlandırılmalıdır (cp.44)
C++ Temel Yönergeleri
CP.44: S ve unique_lock
s adlarınızı lock_guard
unutmayın
Açıklamalar
Standart kitaplık, yaşamları boyunca kaynaklara eşzamanlı erişimi denetlemeye yardımcı olmak için kilitler sağlar. Adı olmayan bir kilit nesnesi bildirdiğinizde, derleyici kapsayan kapsamın sonuna kadar olan bir nesne yerine hemen yok edilen geçici bir nesne oluşturur. Bu nedenle, bir değişkene kilit nesnesi atanamaması, kilitleme mekanizmasını etkin bir şekilde devre dışı bırakma hatasıdır (çünkü geçici değişkenler geçicidir). Bu kural, bu tür istenmeyen davranışlara yönelik basit durumları yakalar.
Bu tanılama yalnızca , std::unique_lock
ve std::lock_guard
standart kilit türlerini std::scoped_lock
analiz eder. Uyarı C26444 diğer adsız RAII türlerini kapsar.
Çözümleyici yalnızca oluşturuculara yapılan basit çağrıları analiz eder. Daha karmaşık başlatıcı ifadeleri, yanıtsız uyarılar biçiminde yanlış sonuçlara yol açabilir. Çözümleyici, işlev çağrılarına bağımsız değişken olarak geçirilen veya işlev çağrılarından döndürülen kilitleri yoksayar. Bu kilitlerin kasıtlı olarak bu işlev çağrısını korumaya çalıştığını veya yaşam sürelerinin uzatılıp uzatılmaması gerektiğini belirleyemiyor. İşlev çağrısı tarafından döndürülen türlere benzer bir koruma sağlamak için, ile [[nodiscard]]
bunlara ek açıklama yazın. Ayrıca, bu türdeki adlandırılmamış nesneleri önlemek için ile oluşturuculara [[nodiscard]]
açıklama ekleyebilirsiniz:
struct X { [[nodiscard]] X(); };
void f() {
X{}; // warning C4834
}
Çözümleyici, geçici olarak oluşturulan ancak yaşam süresini uzatmak için adlandırılmış başvurulara atanan kilitleri yoksayar.
Kod analizi adı: NO_UNNAMED_GUARDS
Örnek
Bu örnekte, kapsamı belirlenmiş kilidin adı eksiktir.
void print_diagnostic(std::string_view text)
{
auto stream = get_diagnostic_stream();
if (stream)
{
std::lock_guard<std::mutex>{ diagnostic_mutex_ }; // C26441
write_line(stream, text);
}
}
Hatayı düzeltmek için, kilit için ömrünü uzatan bir ad verin.
void print_diagnostic(std::string_view text)
{
auto stream = get_diagnostic_stream();
if (stream)
{
std::lock_guard<std::mutex> lock{ diagnostic_mutex_ };
write_line(stream, text);
}
}