Advertencia C26441
Los objetos guard deben tener el nombre (cp.44)
C++ Core Guidelines
CP.44: No olvide asignar un nombre a sus lock_guard
s y unique_lock
s
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_lock
de bloqueo estándar , std::unique_lock
y 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);
}
}