Предупреждение C26441
Объекты Guard должны быть названы (cp.44)
C++ Core Guidelines
CP.44: Не забудьте назвать ваши lock_guard
s и unique_lock
s
Замечания
Стандартная библиотека предоставляет блокировки для управления одновременным доступом к ресурсам во время их существования. При объявлении объекта блокировки без имени компилятор создает временный объект, который немедленно деструируется, а не тот, который находится в конце заключающей области. Таким образом, неспособность назначить объект блокировки переменной является ошибкой, которая эффективно отключает механизм блокировки (так как временные переменные являются временными). Это правило перехватывает простые случаи такого непреднамеренного поведения.
Эта диагностика анализирует только стандартные типы std::scoped_lock
блокировки иstd::unique_lock
std::lock_guard
. Предупреждение C26444 охватывает другие неименованные типы RAII.
Анализатор анализирует только простые вызовы конструкторов. Более сложные выражения инициализатора могут привести к неточным результатам в виде пропущенных предупреждений. Анализатор игнорирует блокировки, передаваемые в качестве аргументов для вызовов функций или возвращаемых из вызовов функций. Не удается определить, следует ли эти блокировки намеренно пытаться защитить этот вызов функции или если их время существования должно быть продлено. Чтобы обеспечить аналогичную защиту для типов, возвращаемых вызовом функции, заметьте их с [[nodiscard]]
помощью. Конструкторы также можно добавлять в заметки, [[nodiscard]]
чтобы избежать неименованных объектов этого типа:
struct X { [[nodiscard]] X(); };
void f() {
X{}; // warning C4834
}
Анализатор игнорирует блокировки, созданные как временные, но назначенные именованным ссылкам, чтобы продлить их время существования.
Имя анализа кода: NO_UNNAMED_GUARDS
Пример
В этом примере отсутствует имя блокировки с заданной областью.
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);
}
}
Чтобы устранить ошибку, присвойте ему имя блокировки, которое расширяет его время существования.
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);
}
}