Qu'est-ce que l'analyse statique ?
L'analyse statique est l'analyse automatisée du code source sans exécuter l'application.
Si l'analyse est effectuée pendant l'exécution du programme, elle est appelée analyse dynamique.
L'analyse statique est fréquemment utilisée pour identifier les éléments suivants :
Failles de sécurité. Problèmes de performance. Non-respect des normes. Utilisation de constructions de programmation obsolètes. Comment fonctionne un outil d'analyse statique ? Le concept fondamental commun à tous les outils d'analyse statique consiste à parcourir le code source afin d'identifier certains modèles de codage auxquels une alerte ou une information est associée.
Cela peut être aussi simple que « Les classes de test JUnit 5 ne doivent pas nécessairement être « publiques ». Ou quelque chose de plus complexe à identifier, comme « Entrée de chaîne non fiable utilisée dans une instruction d'exécution SQL ».
Les outils d'analyse statique diffèrent dans la manière dont ils implémentent cette fonctionnalité.
Technologie d'analyse du code source pour la création d'un arbre syntaxique abstrait (AST), Comparaison de texte avec des expressions régulières, Une combinaison des éléments susmentionnés. La comparaison d'expressions régulières sur du texte est très flexible, il est facile d'écrire des règles de comparaison, mais cela peut souvent conduire à de nombreux résultats faussement positifs, et les règles de comparaison ne connaissent pas le contexte du code environnant.
L'AST-Matching traite le code source comme du code de programme et non comme de simples fichiers remplis de texte. Cela permet une comparaison plus spécifique et contextuelle et peut réduire le nombre de faux positifs signalés par rapport au code.
Analyse statique dans l'intégration continue Les analyses statiques sont fréquemment effectuées au cours du processus d'intégration continue (CI) afin de générer un rapport sur les problèmes de conformité qui peut être examiné pour obtenir une vue d'ensemble objective de la base de code au fil du temps.
Certains utilisateurs se servent de l'analyse statique comme mesure objective de la qualité de leur code en configurant l'outil d'analyse statique de manière à ce que seules certaines parties du code soient évaluées et que seul un sous-ensemble de règles soit pris en compte.
L'objectivité est garantie par les règles utilisées, car celles-ci ne changent pas au fil du temps dans leur évaluation du code. Il est évident que la combinaison des règles utilisées et leur configuration relèvent d'une décision subjective, et différentes équipes choisissent d'utiliser des règles différentes à des moments différents.
Il est utile d'effectuer l'analyse statique dans CI, mais cela peut retarder le retour d'information au programmeur. Les programmeurs ne reçoivent pas de retour d'information pendant la programmation, mais plus tard, lorsque le code passe par l'outil d'analyse statique. Un autre effet secondaire de l'exécution de l'analyse statique dans CI est que les résultats sont plus faciles à ignorer.
Afin d'encourager les équipes à accorder davantage d'attention aux résultats de l'analyse statique, il est généralement possible de configurer une métrique de seuil dans le processus de compilation, de sorte que la compilation échoue si la métrique est dépassée, par exemple une série de règles déclenchées.
Analyse statique dans l'IDE Afin d'obtenir un retour d'information plus rapide, il existe de nombreux plugins IDE qui exécutent les règles d'analyse statique dans l'IDE à la demande ou à intervalles réguliers lorsque le code est modifié.
Les violations des règles peuvent alors être affichées dans l'IDE pendant que le programmeur écrit le code. Afin de rendre plus difficile le non-respect des règles, les violations peuvent souvent être configurées de manière à être affichées dans l'éditeur sous forme de code souligné.
Personnellement, je trouve que c'est une méthode utile pour améliorer mon codage, en particulier lorsque je travaille avec une nouvelle bibliothèque couverte par l'outil d'analyse statique. Cependant, cela peut être « bruyant » en cas de faux positifs ou de règles qui ne vous intéressent pas. Ce problème peut toutefois être résolu en prenant la précaution supplémentaire de configurer l'outil d'analyse statique de manière à ignorer certaines règles.
Correction de code sur la base de règles d'analyse statique Avec la plupart des outils d'analyse statique, la correction des règles incombe au programmeur, qui doit comprendre la cause de la violation de la règle et savoir comment y remédier.
Très peu d'outils d'analyse statique offrent également la possibilité de corriger les violations, car la correction dépend souvent de l'équipe, de la technologie utilisée et des styles de codage convenus.
Règles standard Une confiance injustifiée dans la qualité des règles peut apparaître lorsque les outils d'analyse statique sont équipés de règles standard. Il est tentant de croire qu'ils couvrent tous les problèmes auxquels un programmeur pourrait être confronté et toutes les circonstances dans lesquelles la règle devrait s'appliquer. Parfois, les circonstances dans lesquelles une règle devrait s'appliquer sont subtiles et peuvent ne pas être faciles à reconnaître.
Il est à espérer que les programmeurs, grâce à l'utilisation d'un outil d'analyse statique et à un examen plus approfondi des règles et des infractions, développeront la capacité de reconnaître et d'éviter le problème dans le contexte de leur domaine spécifique.
Si des règles contextuelles sont requises pour le domaine, les outils d'analyse statique peuvent ne pas disposer de règles correspondant à votre domaine ou bibliothèque. De plus, ces outils peuvent souvent s'avérer complexes à configurer et à étendre.
Contretemps Aucun de ces « désagréments » n'est insurmontable :
faux positif Absence de corrections Configuration pour ignorer les règles Ajouter des règles contextuelles Cependant, elles sont souvent utilisées comme prétextes pour éviter d'emblée l'utilisation d'outils d'analyse statique, ce qui est regrettable, car l'analyse statique peut être extrêmement utile pour :
mettre en avant les meilleures approches pour les jeunes développeurs Recevez rapidement des commentaires sur les violations manifestes du code. Identifiez les problèmes complexes auxquels le programmeur n'a jamais été confronté. Confirmer que le programmeur a adopté une approche de codage appropriée (à condition qu'aucune violation ne soit signalée). Outils d'analyse statique basés sur IDE En tant que contributeur individuel à un projet, j'apprécie d'utiliser des outils d'analyse statique qui s'exécutent dans l'IDE, ce qui me permet d'obtenir rapidement des commentaires sur mon code.
Cela complète tout processus d'examen des demandes d'extraction et l'intégration CI dont un projet peut disposer.
Je m'efforce de trouver des outils qui me procurent un avantage et améliorent mon flux de travail individuel.
Lorsque les outils sont exécutés dans l'IDE, il peut être tentant de les considérer comme synonymes, car ils utilisent généralement la même interface graphique de base et la même approche de configuration.
Les outils peuvent présenter des fonctionnalités ou des ensembles de règles qui se recoupent, mais afin d'en tirer le meilleur parti, j'installe plusieurs outils pour exploiter leurs points forts.
Les outils IDE pour les analyses statiques que j'utilise activement lors du codage sont répertoriés ci-dessous :
Les inspections IntelliJ intégrées — modèles de codage courants SpotBugs — erreurs fréquentes SonarLint — Modèles d'utilisation généraux CheckStyle - Modèles de style courants Sensei Secure Code Warrior Création de règles personnalisées Je les utilise tous, car ils fonctionnent bien ensemble, se complètent et se renforcent mutuellement.
Inspections IntelliJ Si vous utilisez IntelliJ, vous utilisez déjà ses inspections.
Il s'agit de règles d'analyse statique identifiées dans l'IDE. Certaines d'entre elles disposent également d'options QuickFix permettant de réécrire le code afin de résoudre le problème.
Les règles peuvent être activées ou désactivées, et vous pouvez sélectionner le niveau d'erreur avec lequel elles seront mises en évidence dans l'IDE.
Il existe de nombreuses inspections IntelliJ de qualité. Je le sais, car je les ai consultées pendant que je rédigeais cet article. J'utilise les inspections IntelliJ par défaut et je ne les ai pas configurées, mais pour tirer pleinement parti des inspections, il est recommandé de les examiner, d'identifier celles qui sont pertinentes pour votre style de codage et de configurer le niveau d'alerte de manière à les remarquer dans le code.
Ce qui est remarquable avec les inspections IntelliJ, c'est qu'elles sont incluses gratuitement dans l'IDE et qu'elles contribuent à développer la mémoire musculaire de :
Identification des avertissements et des erreurs dans le code source pendant la rédaction du code Veuillez placer le curseur de la souris sur le code marqué pour découvrir les violations des règles. Veuillez utiliser Alt+Entrée pour appliquer une solution rapide au problème.
Détecter les erreurs Détecter les bogues Le plugin IntelliJ utilise l'analyse statique pour vous signaler les erreurs dans votre code.
Les SpotBugs peuvent être configurés dans les paramètres IntelliJ afin que votre code soit analysé. Les règles effectivement utilisées se trouvent dans l'onglet Detector.
J'ai tendance à utiliser SpotBugs après avoir écrit et vérifié mon code. Ensuite, j'exécute l'option « Analyser les fichiers du projet, y compris les sources de test ».
Cela m'aide à identifier les erreurs, le code inutilisé et les optimisations évidentes. Cela m'oblige également à examiner certaines des violations signalées afin de m'aider à déterminer les mesures à prendre.
SpotBugs identifie les problèmes, mais ne propose pas de solutions rapides pour tenter de les résoudre.
SpotBugs est facile à configurer et je le considère comme un deuxième avis objectif et utile que je peux obtenir dans mon IDE.
Sonar Lint Le plugin Sonar Lint .
SonarLint peut être configuré dans les paramètres IntelliJ afin de sélectionner les règles selon lesquelles le code sera validé.
Par défaut, SonarLint s'exécute en temps réel et signale les problèmes dans le code que vous êtes en train de modifier.
SonarLint ne fournit pas de solutions rapides, mais la documentation associée aux rapports d'infraction est généralement claire et bien documentée.
J'ai trouvé SonarLint utile par le passé pour me signaler les nouvelles fonctionnalités Java dont j'avais connaissance dans les versions récentes de Java.
Veuillez vérifier Vérifier le style Le plugin propose un ensemble de règles de formatage et de qualité du code.
Le plugin CheckStyle est fourni dans le pack avec « Sun Checks » et « Google Checks ».
Les définitions de ces termes peuvent être facilement trouvées en ligne .
CheckStyle offre une valeur ajoutée optimale lorsqu'un projet a pris le temps de créer son propre ensemble de règles. Le plugin IDE peut alors être configuré pour utiliser cet ensemble de règles, et les programmeurs peuvent effectuer une analyse avant de transférer le code vers CI.
CheckStyle est fréquemment utilisé comme plugin de défaillance de compilation pour les processus CI lorsque le nombre d'infractions CheckStyle dépasse un certain seuil.
Sensei Sensei utilise une analyse statique basée sur un arbre syntaxique abstrait (AST) pour comparer le code et créer des QuickFixes. Cela permet d'identifier de manière très précise le code présentant des problèmes.
L'AST permet aux QuickFixes associés à une recette de comprendre le code environnant, par exemple, lorsqu'une nouvelle classe est ajoutée au code, chaque importation pour cette classe n'est ajoutée qu'une seule fois au fichier source et non pour chaque remplacement.
Sensei conçu pour faciliter la création de règles de correspondance personnalisées qui pourraient ne pas exister dans d'autres outils ou qui seraient difficiles à configurer.
Au lieu de modifier un fichier de configuration, l'ensemble de la configuration peut être effectué dans l'interface graphique. Lors de la création de nouvelles recettes, l'interface graphique permet de déterminer facilement à quel code la recette correspond. De plus, lors de la définition des QuickFixes, l'état avant et après du code peut être immédiatement comparé. Cela facilite la création de recettes très contextuelles, c'est-à-dire spécifiques aux équipes, aux technologies et même aux programmeurs individuels.
J'utilise Sensei combinaison avec d'autres outils d'analyse statique. La plupart des outils d'analyse statique identifient les problèmes, mais ne les corrigent pas. Une utilisation fréquente de Sensei Sensei la recherche appropriée de l'autre outil dans Sensei et Sensei l'étendre avec une correction rapide. Cela présente l'avantage que la correction personnalisée appliquée est déjà conforme aux normes de codage de votre projet.
À intervalles réguliers, je crée Sensei qui sont déjà incluses dans le jeu IntelliJ Intensions, soit parce que le rapport Intension ne correspond pas tout à fait au contexte que j'ai créé, soit parce que le QuickFix fourni par IntelliJ ne correspond pas au modèle de code que je souhaite utiliser.
Je complète les outils existants au lieu de chercher à les remplacer complètement.
Sensei également s'avérer très utile lorsque vous identifiez une variante contextuelle d'une règle générale. Par exemple, si vous utilisez une bibliothèque SQL qui n'est pas prise en charge par l'outil d'analyse statique, mais que les règles SQL générales du moteur d'analyse statique restent applicables, Sensei vous permet de créer des variantes Sensei pour ces règles.
Sensei ne Sensei pas autant de recettes génériques que les outils d'analyse statique mentionnés. Sa force réside dans sa capacité à simplifier la création de nouvelles recettes, complétées par des QuickFixes configurés pour s'adapter à votre style de codage spécifique et à vos cas d'utilisation.
Remarque : nous travaillons actuellement sur la création d'une archive publique de recettes afin de couvrir les cas d'utilisation génériques. vous pouvez la consulter ici .
Résumé J'ai tendance à sélectionner des outils qui fonctionnent ensemble, qui sont configurables et faciles à étendre afin de répondre à mon contexte spécifique. J'utilise depuis des années des outils d'analyse statique dans l'IDE pour identifier les problèmes et en apprendre davantage sur les langages de programmation et les bibliothèques que j'utilise.
J'utilise tous les outils mentionnés en combinaison :
IntelliJ Intentions facilite l'identification immédiate des problèmes de code courants, souvent accompagnés de QuickFixes correspondants. SpotBugs identifie les erreurs simples que j'aurais pu manquer et m'avertit des problèmes de performance. SonarLint identifie des fonctions Java dont je n'avais pas connaissance et me recommande de modéliser davantage mon code. CheckStyle m'assiste dans le respect d'un style de codage convenu, qui est également appliqué pendant l'intégration continue. Sensei dans la création de QuickFixes pour étendre les scénarios courants identifiés à l'aide d'outils d'analyse statique et pour créer des recettes spécifiques à des projets ou à des technologies qui sont difficiles à configurer dans un autre outil.
---
Veuillez installer Sensei IntelliJ via « Préférences\ Plugins » (Mac) ou « Paramètres\ Plugins » (Windows), puis recherchez simplement «Sensei Code ».
Vous trouverez un référentiel contenant des exemples de code et des recettes pour les cas d'utilisation courants dans le compte GitHub de Secure Code Warrior projet «sensei ».
https://github.com/securecodewarrior/sensei-blog-examples
En savoir plus sur Sensei