Aviso C26438
Evitar
goto
(es.76)
Diretrizes Principais do C++:
ES.76: Evitar goto
O uso de goto
é uma prática consideravelmente perigosa e propensa a erros. É aceitável apenas em código gerado, como em um analisador gerado com base em uma gramática. Com os recursos e utilitários modernos do C++ fornecidos pela Biblioteca de Suporte de Diretrizes, é fácil evitar completamente o uso de goto
.
Comentários
- Esta regra avisa sobre qualquer ocorrência de , mesmo que aconteça em código morto, exceto código de
goto
modelo que nunca é usado e, portanto, é ignorado pelo compilador. - Os avisos podem se multiplicar quando uma macro contém
goto
. Os mecanismos de relatório atuais apontam para todas as instâncias em que essa macro é expandida. Muitas vezes, isso pode ser corrigido em um só local, alterando a macro, ou evitando seu uso para dar lugar a mecanismos mais fáceis de manter.
Nome da análise de código: NO_GOTO
Exemplo
'goto clean-up' na 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' na macro, substituído 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;
// ...
}
}