Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Considere usar
gsl::finallyse a ação final for pretendida (gsl.util)
Diretrizes principais do C++: GSL.util: Utilitários
A Biblioteca de Suporte de Diretrizes fornece um utilitário conveniente para implementar o conceito de ação final . Como a linguagem C++ não suporta construções try-end, tornou-se comum implementar tipos de limpeza personalizados que invocariam ações arbitrárias na destruição. O gsl::finally utilitário é implementado dessa maneira e fornece uma maneira mais uniforme de executar ações finais em uma base de código.
Há também casos em que as ações finais são executadas de uma maneira antiquada no estilo C usando goto instruções (o que é desencorajado pelo C26438 NO_GOTO). É difícil detetar a intenção exata no código que usa gotomuito, mas algumas heurísticas podem ajudar a encontrar melhores candidatos para limpeza.
Observações
- Esta regra é leve e usa nomes de rótulos para adivinhar oportunidades de usar objetos de ação final.
- Os nomes de rótulos que podem gerar um aviso contêm palavras como "fim", "final", "limpo" e assim por diante.
- Avisos aparecem nas
gotodeclarações. Você pode ver uma saída detalhada em algumas ocasiões, mas a saída pode ajudar na priorização do código, dependendo de sua complexidade. - Esta regra vai sempre em par com C26438 NO_GOTO. Dependendo das prioridades, uma dessas regras pode ser desativada.
Nome da análise de código: USE_GSL_FINALLY
Exemplo
Limpeza com várias instruções goto:
void poll(connection_info info)
{
connection c = {};
if (!c.open(info))
return;
while (c.wait())
{
connection::header h{};
connection::signature s{};
if (!c.read_header(h))
goto end; // C26448 and C26438
if (!c.read_signature(s))
goto end; // C26448 and C26438
// ...
}
end:
c.close();
}
Limpeza com várias instruções goto substituídas por gsl::finally:
void poll(connection_info info)
{
connection c = {};
if (!c.open(info))
return;
auto end = gsl::finally([&c] { c.close(); });
while (c.wait())
{
connection::header h{};
connection::signature s{};
if (!c.read_header(h))
return;
if (!c.read_signature(s))
return;
// ...
}
}