Warnung C26438
Vermeiden
goto
(es.76)
C++-Kernrichtlinien:
ES.76: Vermeiden von Goto
Die Verwendung von goto
wird häufig als gefährliche und fehleranfällige Praxis angesehen. Es ist nur in generiertem Code zulässig, z. B. in einem Parser, der aus einer Grammatik generiert wurde. Mit modernen C++-Features und Dienstprogrammen, die von der Richtlinien-Supportbibliothek bereitgestellt werden, sollte es einfach sein, ganz zu vermeiden goto
.
Hinweise
- Diese Regel warnt bei jedem Vorkommen von
goto
, auch wenn dies im inaktiven Code geschieht, mit Ausnahme von Vorlagencode, der niemals verwendet wird und daher vom Compiler ignoriert wird. - Warnungen können sich multiplizieren, wenn ein Makro enthält
goto
. Aktuelle Berichtsmechanismen verweisen auf alle Instanzen, in denen ein solches Makro erweitert wird. Es kann häufig an einer Stelle durch Ändern des Makros behoben werden oder die Verwendung zugunsten von mehr Standard nachhaltigen Mechanismen vermieden werden.
Codeanalysename: NO_GOTO
Beispiel
"Gehe zu sauber-Up" im Makro
#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 sauber-up" im Makro ersetzt durchgsl::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;
// ...
}
}