? argumento
Linter for Go que verifica os argumentos de chamada estática contra os guardas de função (também conhecidos como contratos).
Exemplo
Digamos que você tem a seguinte função:
func div ( n , d float64 ) float64 {
if d == 0 {
panic ( "denominator must not be zero" )
}
return n / d
} E então você chama assim:
Mesmo se não conhecemos userInput , podemos ver que essa chamada de função entrará em pânico no tempo de execução porque o segundo argumento é sempre zero.
O Linter encontra e relata esses lugares usando execução de código parcial segura e magia negra.
? Instalação
go install github.com/orsinium-labs/arguard@latest
Uso
Bandeiras disponíveis:
-
-contracts.follow-imports : Defina este sinalizador como false para não extrair contratos dos módulos importados. Em outras palavras, as violações do contrato (guarda) serão relatadas apenas se a função com o contrato e a chamada de função estiverem localizadas no mesmo pacote analisado. Útil para melhor desempenho . -
-contracts.report-contracts : Emite uma mensagem para cada contrato detectado. Útil para a depuração para ver se um contrato foi detectado pelo linhador ou não. -
-arguard.report-errors : Defina este sinalizador para mostrar falhas durante a execução do contrato. Por padrão, se a Arguard não executar um contrato, ele apenas avançará sem relatar nada. Útil para a depuração para ver por que um erro de contrato não foi relatado.
? QNA
- ? Como funciona? Existem dois analisadores dentro. O primeiro detecta contratos seguros de exceção (guardas) no código. O segundo detecta chamadas para funções com contratos conhecidos, extrai argumentos estaticamente conhecidos e executa contratos que podem ser executados usando Yaegi.
- ? O que é um guarda (contrato)? Uma condição IF no início da função (apenas outros contratos podem ir antes dela) com uma verificação segura de exceção e o corpo retornando apenas um erro ou chamando
panic . - ? Quão confiáveis são os resultados? Se relatar um erro, há, provavelmente, um erro. Se não relatar um erro, ainda pode haver um erro. É um linhador, não um verificador formal.
- ⚖️ Quão estável é o projeto? A análise estática em Go pode ser confusa, especialmente quando também fazemos a execução parcial do código. O linhador pode falhar, estar errado ou não ser tão inteligente quanto potencialmente pode ser. Ainda assim, é um analisador estático, não uma dependência de produção, portanto, deve ser seguro usá -lo em qualquer projeto em qualquer ambiente. Lembre -se, porém, que ainda existe uma execução parcial do código, para que você provavelmente não deve executá -lo em código não confiável, apenas para ser seguro.
- ? Haveria mudanças de quebra? O projeto segue Semver. No entanto, todo lançamento, mesmo um patch, pode começar a relatar novas violações em seu código. Então, em certo sentido, todo lançamento pode estar quebrando.
- ? Existe uma integração de Golangci-Lint? Ainda não, mas eventualmente será. É fácil integrar qualquer linter alimentado por análise com Golangci-Lint, e o argumento é alimentado por análises. Fique atento.
- ✏️ Existe uma integração de IDE? Ainda não. Quando temos a integração de Golangci-Lint, as integrações do IDE virão gratuitamente.
- ? Esta é uma nova ideia? O projeto implementa uma das coisas que lida, minha biblioteca Python para design por contrato pode fazer. O negócio em si é construído sobre a sabedoria das gerações, veja essa linha do tempo.
- Existe uma API GO para que eu possa usá -la como uma biblioteca? Sim. O pacote de análise fornece uma maneira nativa de compor analisadores, e é assim que você pode usar o projeto. Consulte Main.GO para um exemplo de como criar e compor várias instâncias
analysis.Analyzer . - ? ? ️ É mantido ativamente? O projeto, nas melhores tradições do Unixway, tem um escopo muito pequeno e claramente definido. Eu poderia voltar a isso de tempos em tempos e trazer novas idéias interessantes que eu tinha durante as noites sem dormir, mas não há nada para manter diariamente. Se funcionar hoje, não será quebrado amanhã, graças à pequena lista de dependências e à promessa de compatibilidade Go 1.
- ? E se eu encontrasse um bug? Fifra o projeto, corrija o bug, escreva alguns testes e abra uma solicitação de tração. Normalmente, eu mescho e libero quaisquer contribuições dentro de um dia.