? argument
Linter pour Go qui vérifie les arguments d'appel statique contre les gardes de fonctions (aka contrats).
Exemple
Disons que vous avez la fonction suivante:
func div ( n , d float64 ) float64 {
if d == 0 {
panic ( "denominator must not be zero" )
}
return n / d
} Et puis vous l'appelez comme ceci:
Même si nous ne connaissons pas userInput , nous pouvons voir que cet appel de fonction paniquera dans l'exécution car le deuxième argument est toujours nul.
Le linter trouve et rapporte ces endroits à l'aide de l'exécution de code partielle et de la magie noire sûre.
? Installation
go install github.com/orsinium-labs/arguard@latest
Usage
Drapeaux disponibles:
-
-contracts.follow-imports : Définissez ce drapeau sur FALS pour ne pas extraire les contrats à partir des modules importés. En d'autres termes, les violations du contrat (Guard) ne seront signalées que si la fonction avec le contrat et l'appel de fonction sont situées dans le même package analysé. Utile pour de meilleures performances . -
-contracts.report-contracts : émettez un message pour chaque contrat détecté. Utile pour le débogage pour voir si un contrat a été détecté par le Linter ou non. -
-arguard.report-errors : Définissez ce drapeau pour afficher les échecs pendant l'exécution du contrat. Par défaut, si Arguard ne parvient pas à exécuter un contrat, il passe simplement sans signaler quoi que ce soit. Utile pour le débogage pour voir pourquoi une erreur de contrat n'a pas été signalée.
? Qna
- ? Comment ça marche? Il y a deux analyseurs à l'intérieur. Le premier détecte des contrats sûrs à exécution (gardes) dans le code. Le second détecte les appels aux fonctions avec des contrats connus, extrait des arguments statiques connus et exécute des contrats qui peuvent être exécutés à l'aide de Yaegi.
- ? Qu'est-ce qu'un garde (contrat)? Une condition IF au début de la fonction (seuls les autres contrats peuvent aller avant) avec un contrôle sûr à exécutif et le corps ne renvoyant qu'une erreur ou appelant
panic . - ? Dans quelle mesure les résultats sont-ils fiables? S'il signale une erreur, il y a, très probablement, une erreur. S'il ne signale pas d'erreur, il pourrait toujours y avoir une erreur. C'est un linter, pas un vérificateur formel.
- ⚖️ Dans quelle mesure le projet est-il stable? L'analyse statique dans GO peut être désordonnée, surtout lorsque nous effectuons également une exécution partielle de code. Le linter peut échouer, se tromper ou ne pas être aussi intelligent que possible. Pourtant, c'est un analyseur statique, pas une dépendance de la production, il devrait donc être sûr de l'utiliser sur n'importe quel projet dans n'importe quel environnement. Gardez à l'esprit, cependant, qu'il y a encore une exécution partielle de code, vous ne devriez probablement pas l'exécuter sur du code non fiable, juste pour être sûr.
- ? Y aurait-il des changements de rupture? Le projet suit Semver. Cependant, chaque version, même un patch, peut commencer à signaler de nouvelles violations dans votre code. Donc, dans un sens, chaque version peut se briser.
- ? Y a-t-il une intégration Golangci-lint? Pas encore mais le sera finalement. Il est facile d'intégrer tout linter alimenté par analyse avec Golangci-lint, et Arguard est alimenté par analyse. Restez à l'écoute.
- ✏️ Y a-t-il une intégration IDE? Pas encore. Lorsque nous avons l'intégration de Golangci-lint, les intégrations IDE viendront gratuitement.
- ? Est-ce une nouvelle idée? Le projet met en œuvre l'une des choses qui traitent, ma bibliothèque Python pour la conception par contrat peut faire. L'accord lui-même est construit sur la sagesse des générations, voir cette chronologie.
- Y a-t-il une API Go pour que je puisse l'utiliser comme bibliothèque? Oui. Le package d'analyse fournit un moyen natif de composer les analyseurs, et c'est ainsi que vous pouvez utiliser le projet. Voir main.go pour un exemple de la façon de créer et de composer plusieurs instances
analysis.Analyzer . - ? ? ️ est-il activement maintenu? Le projet, dans les meilleures traditions d'Unix-Way, a une portée très petite et clairement définie. Je pourrais y revenir de temps en temps et apporter de nouvelles idées intéressantes que j'ai eues pendant les nuits blanches, mais il n'y a rien à maintenir quotidiennement. Si cela fonctionne aujourd'hui, il ne se brisera pas demain, grâce à la courte liste de dépendances et à la promesse de compatibilité Go 1.
- ? Et si je trouvais un bug? Fourk le projet, corriger le bogue, écrire des tests et ouvrir une demande de traction. Je fusit et divulgue généralement toutes les contributions en une journée.