Udostępnij przez


Ostrzeżenie C26441

Obiekty guard muszą mieć nazwę (cp.44)

Podstawowe wytyczne dotyczące języka C++

CP.44: Pamiętaj, aby nazwać s lock_guardi unique_locks

Uwagi

Biblioteka standardowa zapewnia blokady ułatwiające kontrolowanie współbieżnego dostępu do zasobów w okresie ich istnienia. Podczas deklarowania obiektu blokady bez nazwy kompilator tworzy obiekt tymczasowy, który jest natychmiast zdestrukturowany, a nie taki, który znajduje się na końcu otaczającego zakresu. Dlatego niepowodzenie przypisania obiektu blokady do zmiennej jest błędem, który skutecznie wyłącza mechanizm blokowania (ponieważ zmienne tymczasowe są przejściowe). Ta reguła przechwytuje proste przypadki takiego niezamierzonego zachowania.

Ta diagnostyka analizuje tylko standardowe typy std::scoped_lockblokad , std::unique_locki std::lock_guard. Ostrzeżenie C26444 obejmuje inne nienazwane typy RAII.

Analizator analizuje tylko proste wywołania konstruktorów. Bardziej złożone wyrażenia inicjatora mogą prowadzić do niedokładnych wyników w postaci pominiętych ostrzeżeń. Analizator ignoruje blokady przekazywane jako argumenty do wywołań funkcji lub zwracane z wywołań funkcji. Nie można ustalić, czy blokady te celowo próbują chronić to wywołanie funkcji lub czy ich okres istnienia powinien zostać przedłużony. Aby zapewnić podobną ochronę typów zwracanych przez wywołanie funkcji, dodaj do nich adnotację .[[nodiscard]] Można również dodawać adnotacje konstruktorom, [[nodiscard]] aby uniknąć nienazwanych obiektów tego typu:

struct X { [[nodiscard]] X(); };

void f() {
    X{}; // warning C4834
}

Analizator ignoruje blokady utworzone jako tymczasowe, ale przypisane do nazwanych odwołań w celu wydłużenia ich okresu istnienia.

Nazwa analizy kodu: NO_UNNAMED_GUARDS

Przykład

W tym przykładzie brakuje nazwy blokady o określonym zakresie.

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);
    }
}

Aby naprawić błąd, podaj nazwę blokady, która wydłuża jego okres istnienia.

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);
    }
}

Zobacz też

C26444