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_guard
i unique_lock
s
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_lock
blokad , std::unique_lock
i 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ż
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla