NilAway : un outil d'analyse statique pour détecter les panics nil potentiels en Go
Outil d'analyse statique pour détecter les paniques nulles potentielles dans le code Go. NilAway [![GoDoc][doc-img]][doc] [![Build Status][ci-img]][ci] [![Coverage Status][cov-img]][cov] [!WARNING] NilAway est actuellement en développement actif : des faux positifs et des modifications importantes peuvent survenir.
En bref
- De quoi s’agit-il ?
- Un outil d'analyse statique qui suit les flux nil dans et entre les paquets pour détecter les panics potentiels au moment de la compilation.
- À qui s’adresse-t-il ?
- Ce projet s adresse aux équipes dont le besoin correspond précisément à nilaway et aux éléments documentés dans son README. Avant de l intégrer, exécutez le point de contrôle propre au dépôt : Le contrôle autonome passe par `go install go.uber.org/nilaway/cmd/nilaway@latest`, puis `nilaway -include-pkgs="<YOUR_PKG_PREFIX>" ./...`.
- Puis-je l’utiliser commercialement ?
- Oui. Apache-2.0 est une licence permissive : vous pouvez utiliser, modifier et vendre un logiciel qui en dépend, à condition de conserver les mentions de droit d’auteur et de licence.
- Est-il encore maintenu ?
- Oui. Les derniers commits datent d’il y a 7 jours.
- En quel langage est-il écrit ?
- Principalement Go, d’après les statistiques de langage de GitHub.
Ces réponses reposent sur les données GitHub du projet (dernière synchronisation le 14 septembre 2026) et sur notre analyse. Elles ne constituent pas un avis juridique.
ANALYSE OPEN SOURCE APPROFONDIE
L'analyseur et sa relation avec nilness
NilAway est un outil d'analyse statique pour Go qui vise à détecter les panics nil potentiels au moment de la compilation plutôt qu'à l'exécution. Le README le décrit comme similaire à l'analyseur nilness standard, mais avec des techniques plus sophistiquées qui suivent les flux nil à l'intérieur d'un paquet et entre les paquets, en rapportant les erreurs avec le flux nil pour faciliter le débogage. Le projet est en développement actif, donc des faux positifs et des changements cassants peuvent se produire ; le README invite aux retours et contributions.
Trois propriétés qui façonnent son utilisation
Le README attribue trois propriétés à NilAway. Il est entièrement automatisé, ce qui signifie qu'il ne nécessite aucune information supplémentaire de la part des développeurs comme des annotations, seulement du code Go standard. Il est conçu pour être rapide et évolutif ; le README rapporte que leurs mesures montrent moins de 5% de surcoût de compilation lorsqu'il est activé. Il est pratique car il ne prévient pas tous les panics nil possibles mais attrape la plupart de ceux observés en production, visant un équilibre entre utilité et coût de compilation.
Exécuter NilAway en autonome
NilAway est implémenté avec le framework go/analysis, il peut donc fonctionner avec les pilotes d'analyseurs existants. Pour un démarrage rapide, le README montre comment installer le binaire depuis la source : `go install go.uber.org/nilaway/cmd/nilaway@latest` puis exécuter `nilaway -include-pkgs="<YOUR_PKG_PREFIX>" ./...`. Le drapeau include-pkgs est recommandé car par défaut NilAway analyse tout le code Go, y compris les bibliothèques standard et les dépendances, ce que le README dit entraîner un coût de performance significatif et augmenter les erreurs non actionnables dans les dépendances. Pour la sortie JSON, le README suggère de désactiver pretty-print avec `-json -pretty-print=false`.
Intégration avec golangci-lint et nogo
Pour golangci-lint, le README note que NilAway ne peut pas être offert directement comme linter à cause des faux positifs, donc il doit être construit comme un plugin. Il recommande le système de plugins modulaires dans golangci-lint v1.57.0 ou supérieur. Les étapes incluent la création d'un fichier `.custom-gcl.yml` avec le module plugin, l'ajout de NilAway à `.golangci.yaml` avec les paramètres include-pkgs, la construction d'un binaire personnalisé avec `golangci-lint custom`, puis l'exécution de `./custom-gcl run ./...`. Pour Bazel/nogo, le README décrit l'ajout de NilAway comme dépendance d'outil, la mise à jour de la configuration nogo avec l'analyseur, et l'exécution de `bazel build --keep_going //...`. Le README fournit des commandes spécifiques pour ces configurations.
Exemples de flux nil détectés
Le README inclut deux exemples de code. Le premier montre une variable locale `p` initialisée conditionnellement, et un accès au champ `p.f` qui peut paniquer lorsque la condition est fausse ; NilAway signale le flux nil potentiel. Le deuxième exemple a une fonction `foo` retournant un pointeur nil qui est déréférencé dans `bar`, et NilAway suit le flux à travers les frontières de fonction. Le README note que NilAway traite des constructions spécifiques à Go telles que les récepteurs, les interfaces, les assertions de type et les commutateurs de type.
Configuration, support et licence
NilAway expose des drapeaux de configuration via le mécanisme standard de passage de drapeaux dans go/analysis, avec des détails dans la documentation. La politique de support correspond à celle du projet Go, supportant les deux dernières versions majeures de Go. Les contributions sont les bienvenues, et les contributeurs sont invités à signer l'accord de licence de contributeur Uber. Le projet est protégé par les droits d'auteur de Uber Technologies, Inc. (2023) et sous licence Apache 2.0. L'extrait de licence accorde une licence de droit d'auteur perpétuelle, mondiale, non exclusive, gratuite et irrévocable pour reproduire, préparer des œuvres dérivées, afficher publiquement, exécuter, sous-licencier et distribuer l'œuvre ; il ne mentionne pas de garantie ou de conditions de support. Le contrôle autonome passe par `go install go.uber.org/nilaway/cmd/nilaway@latest`, puis `nilaway -include-pkgs="<YOUR_PKG_PREFIX>" ./...`. Pour golangci-lint, le README demande un plugin modulaire et une construction avec `golangci-lint custom`; pour Bazel, il indique `bazel build --keep_going //...`. Comparez les diagnostics sur un exemple où `p` peut rester nil et sur un appel entre fonctions. La configuration `include-pkgs` réduit le bruit des dépendances.
Conclusion éditoriale
Ce projet s adresse aux équipes dont le besoin correspond précisément à nilaway et aux éléments documentés dans son README. Avant de l intégrer, exécutez le point de contrôle propre au dépôt : Le contrôle autonome passe par `go install go.uber.org/nilaway/cmd/nilaway@latest`, puis `nilaway -include-pkgs="<YOUR_PKG_PREFIX>" ./...`. Pour golangci-lint, le README demande un plugin modulaire et une construction avec `golangci-lint custom`; pour Bazel, il indique `bazel build --keep_going //...`. Comparez les diagnostics sur un exemple où `p` peut rester nil et sur un appel entre fonctions. La configuration `include-pkgs` réduit le bruit des dépendances.
Notes de la communauté