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