Aracılığıyla paylaş


Uyarı C26441

Guard nesneleri adlandırılmalıdır (cp.44)

C++ Temel Yönergeleri

CP.44: S ve unique_locks adlarınızı lock_guardunutmayı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_lockve std::lock_guardstandart kilit türlerini std::scoped_lockanaliz 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);
    }
}

Ayrıca bkz.

C26444