Compartir a través de


Advertencia C26441

Los objetos guard deben tener el nombre (cp.44)

C++ Core Guidelines

CP.44: No olvide asignar un nombre a sus lock_guards y unique_locks

Comentarios

La biblioteca estándar proporciona bloqueos para ayudar a controlar el acceso simultáneo a los recursos durante su duración. Cuando se declara un objeto de bloqueo sin un nombre, el compilador crea un objeto temporal que se destruye inmediatamente en lugar de uno que reside al final del ámbito envolvente. Por lo tanto, si no se asigna un objeto de bloqueo a una variable, se produce un error que deshabilita eficazmente el mecanismo de bloqueo (ya que las variables temporales son transitorias). Esta regla detecta casos simples de este comportamiento no deseado.

Este diagnóstico solo analiza los tipos std::scoped_lockde bloqueo estándar , std::unique_locky std::lock_guard. Advertencia C26444 cubre otros tipos RAII sin nombre.

El analizador solo analiza llamadas simples a constructores. Las expresiones de inicializador más complejas pueden dar lugar a resultados inexactos en forma de advertencias perdidas. El analizador omite los bloqueos que se pasan como argumentos a las llamadas de función o se devuelven de las llamadas de función. No se puede determinar si esos bloqueos intentan proteger deliberadamente esa llamada de función o si se debe extender su duración. Para proporcionar protección similar para los tipos devueltos por una llamada de función, anotelos con [[nodiscard]]. También puede anotar constructores con [[nodiscard]] para evitar objetos sin nombre de ese tipo:

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

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

El analizador omite los bloqueos creados como temporalmente, pero asignados a referencias con nombre para ampliar su duración.

Nombre del análisis de código: NO_UNNAMED_GUARDS

Ejemplo

En este ejemplo, falta el nombre del bloqueo con ámbito.

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

Para corregir el error, asigne un nombre al bloqueo, que extiende su duración.

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

Consulte también

C26444