Предупреждение C26441

Объекты Guard должны быть названы (cp.44)

C++ Core Guidelines

CP.44: Не забудьте назвать ваши lock_guards и unique_locks

Замечания

Стандартная библиотека предоставляет блокировки для управления одновременным доступом к ресурсам во время их существования. При объявлении объекта блокировки без имени компилятор создает временный объект, который немедленно деструктирован, а не тот, который находится в конце заключенного область. Таким образом, неспособность назначить объект блокировки переменной является ошибкой, которая эффективно отключает механизм блокировки (так как временные переменные являются временными). Это правило перехватывает простые случаи такого непреднамеренного поведения.

Эта диагностика анализирует только стандартные типы std::scoped_lockблокировки иstd::unique_lockstd::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);
    }
}

См. также

C26444