Partager via


Avertissement C26438

Éviter goto (es.76)

Recommandations principales en C++ :
ES.76 : Éviter goto

L’utilisation est goto largement considérée comme une pratique dangereuse et sujette aux erreurs. Il est acceptable uniquement dans le code généré, par exemple dans un analyseur généré à partir d’une grammaire. Avec les fonctionnalités et utilitaires C++ modernes fournis par la bibliothèque de prise en charge des instructions, il doit être facile d’éviter goto complètement.

Notes

  • Cette règle avertit toute occurrence de goto, même si elle se produit dans du code mort, à l’exception du code de modèle qui n’est jamais utilisé et qui est donc ignoré par le compilateur.
  • Les avertissements peuvent se multiplier lorsqu’une macro contient goto. Les mécanismes de création de rapports actuels pointent vers toutes les instances où une telle macro est développée. Il peut souvent être résolu dans un seul endroit en modifiant la macro, ou en évitant son utilisation en faveur de mécanismes plus maintenables.

Nom de l’analyse du code : NO_GOTO

Exemple

'goto clean-up' dans 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' dans la macro, remplacé par 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;
        // ...
    }
}