Advertencia C26438
Evitar
goto
(es.76)
C++ Core Guidelines:
ES.76: Evitar goto
El uso de goto
se considera en general una práctica peligrosa y propensa a errores. Solo es aceptable en el código generado, como en un analizador generado a partir de una gramática. Con las características y utilidades modernas de C++ que se proporcionan en la biblioteca Guidelines Support Library, debería ser fácil evitar goto
por completo.
Comentarios
- Esta regla advierte sobre cualquier aparición de
goto
, incluso si se produce en código fallido, excepto el código de plantilla que nunca se usa y así lo omite el compilador. - Las advertencias se pueden multiplicar cuando una macro contiene
goto
. Los mecanismos de informes actuales apuntan a todas las instancias en las que se expande dicha macro. A menudo se puede corregir en un lugar cambiando la macro o evitando su uso en favor de mecanismos más fáciles de mantener.
Nombre del análisis de código: NO_GOTO
Ejemplo
"goto clean-up" en la macro
#define ENSURE(E, L) if (!(E)) goto L;
void poll(connection &c)
{
ENSURE(c.open(), end); // C26438
while (c.wait())
{
connection::header h{};
connection::signature s{};
ENSURE(c.read_header(h), end); // C26438
ENSURE(c.read_signature(s), end); // C26438
// ...
}
end:
c.close();
}
"goto clean-up" en macro, reemplazado por gsl::finally
void poll(connection &c)
{
auto end = gsl::finally([&c] { c.close(); });
if (!c.open())
return;
while (c.wait())
{
connection::header h{};
connection::signature s{};
if(!c.read_header(h))
return;
if(!c.read_signature(s))
return;
// ...
}
}