Compartir vía


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;
        // ...
    }
}