Upozornění C26441
Objekty ochrany musí mít název (cp.44)
C++ Core Guidelines
CP.44: Nezapomeňte pojmenovat své lock_guard
unique_lock
Poznámky
Standardní knihovna poskytuje zámky, které pomáhají řídit souběžný přístup k prostředkům během jejich životnosti. Když deklarujete objekt zámku bez názvu, kompilátor vytvoří dočasný objekt, který se okamžitě destrukuje místo objektu, který se nachází na konci ohraničujícího oboru. Selhání přiřazení objektu zámku proměnné je chyba, která efektivně zakáže mechanismus uzamčení (protože dočasné proměnné jsou přechodné). Toto pravidlo zachytává jednoduché případy takového nezamýšleného chování.
Tato diagnostika analyzuje pouze standardní typy std::scoped_lock
zámků , std::unique_lock
a std::lock_guard
. Upozornění C26444 pokrývá jiné nepojmenované typy RAII.
Analyzátor analyzuje pouze jednoduchá volání konstruktorů. Složitější výrazy inicializátoru můžou vést k nepřesným výsledkům ve formě zmeškaných upozornění. Analyzátor ignoruje zámky předané jako argumenty volání funkce nebo vrácené z volání funkce. Není možné určit, jestli se tyto zámky záměrně snaží chránit volání této funkce nebo jestli by se jejich životnost měla prodloužit. Chcete-li poskytnout podobnou ochranu pro typy vrácené voláním funkce, anotujte je pomocí [[nodiscard]]
. Konstruktory můžete také komentovat, [[nodiscard]]
abyste se vyhnuli nepojmenovaným objektům tohoto typu:
struct X { [[nodiscard]] X(); };
void f() {
X{}; // warning C4834
}
Analyzátor ignoruje zámky vytvořené jako dočasné, ale přiřazené pojmenovaným odkazům za účelem prodloužení jejich životnosti.
Název analýzy kódu: NO_UNNAMED_GUARDS
Příklad
V tomto příkladu chybí název uzamčeného oboru.
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);
}
}
Pokud chcete chybu opravit, zadejte název zámku, který prodlužuje jeho životnost.
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);
}
}