Upozornění C26438
Vyhněte se
goto
(es.76)
Pokyny pro C++ Core:
ES.76: Vyhněte se goto
Použití goto
je široce považováno za nebezpečnou a náchylnou k chybám. Je přijatelné pouze ve vygenerovaném kódu, například v analyzátoru vygenerovaném z gramatiky. Díky moderním funkcím a nástrojům jazyka C++, které poskytuje knihovna podpory pokynů, by mělo být snadné se úplně vyhnout goto
.
Poznámky
- Toto pravidlo upozorní na jakýkoli výskyt
goto
, i když dojde v mrtvém kódu, s výjimkou kódu šablony, který se nikdy nepoužívá, a tak je ignorován kompilátorem. - Upozornění se můžou násobit, když makro obsahuje
goto
. Aktuální mechanismy vytváření sestav odkazují na všechny instance, ve kterých se takové makro rozbalí. Často se dá opravit na jednom místě změnou makra nebo se vyhnout jeho použití ve prospěch více udržovatelných mechanismů.
Název analýzy kódu: NO_GOTO
Příklad
"goto clean-up" v makru
#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" v makru, nahrazeno 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;
// ...
}
}