Améliorez vos applications avec l'analyse statique de code

Cet article a été publié depuis plus de 6 mois, cela signifie que le contenu peut ne plus être d'actualité.

Pour corriger des problèmes sur un projet, il est primordial de détecter ces derniers le plus rapidement possible. Effectivement, au plus tôt un problème est détecté et au moins il sera coûteux de résoudre ce dernier. Il est pour cela possible d’avoir recours à de l’analyse statique. Il s’agit d’une opération permettant de détecter automatiquement des erreurs de programmation sans avoir à exécuter de code. Les outils utilisés vont analyser le code source afin de trouver d’éventuelles erreurs et rechercher des modèles de code reconnu comme étant à risque.

Ce billet a été originalement publié sur le blog de la société Novaway dans le cadre de mon travail.

Dans sa forme la plus simple, le mode CLI de PHP propose une option permettant d’analyser un fichier PHP. Il ne s’agit en réalité pas d’une analyse statique, mais plutôt d’une analyse syntaxique (l’opération qui va vérifier que le programme ne contient pas d’erreur de syntaxe). Néanmoins, cela permet d’avoir un premier retour sur le code écrit. Pour effectuer cette opération, il faut utiliser l’argument “-l” de l’interpréteur.

Evaluer l’envergure d’un projet

Obtenir des informations quantifiées sur la taille d’un projet est une opération qui peut s’avérer particulièrement intéressante lors de la prise en main d’un nouveau projet. Un suivi des données recueilli peut également être utile pour mesurer la façon dont le code grossi.

Dans ce cas, PHPLoc est l’outil idéal pour effectuer cette analyse. Ce dernier permet de mesurer rapidement la taille d’un projet PHP et d’en analyser la structure pour ensuite visualiser les résultats sous la forme de statistiques. Cet outil est particulièrement intéressant lors de la prise en main d’un nouveau projet car il permet de se rendre compte de l’envergure de ce dernier.

Les informations fournies par PHPLoc sont exhaustives. Il est possible de connaître le nombre de fichiers composant le projet, le nombre de lignes de code et de commentaires ainsi que le nombre de classes et de méthodes existantes (découpés en fonction de leurs visibilités).

En plus de ces données, PHPLoc fournit des indicateurs sur les dépendances décrites dans le code (utilisation de variables globales, accès direct à des attributs de classes ou l’utilisation de méthodes statiques). Il fournira également quelques informations sur la complexité cyclomatique du projet.

Analyser la complexité du code d’un projet

Il est primordial pour la pérennité d’un projet de pouvoir mesurer la complexité de sa base de code. Cette mesure permet d’avoir des informations sur la facilité de maintenabilité du projet. Des outils d’analyse permettent ainsi de détecter des éventuels problèmes au travers d’un ensemble de règles prédéfinies.

Dans ce sens, PHP Mess Detector (communément appelé PHPMD) vous aidera à identifier les fonctions, méthodes, paramètres ou variables inutilisés. Mais aussi de mettre en évidence des séquences de codes complexes ou des bugs potentiels. Au travers de ces différentes analyses PHPMD sera également capable de proposer des optimisations pour certaines portions de votre projet.

Dans le même esprit, PHP Depend (qui est le portage PHP de JDepend) est une application d’analyse de code et de mesure de la qualité. Les instructions de l’application sont examinées afin de déterminer l’extensibilité, la facilité de réutilisation et de maintenance de la base de code.

Avec l’arrivée de PHP 7, de nouveaux outils ont également fait leur apparition. C’est le cas de Phan. Développé par Etsy, Phan est un analyseur de code statique qui tente de minimiser au maximum les faux positifs. L’outil va se focaliser sur les problèmes les plus fréquents en détectant par exemple les types des paramètres passés aux fonctions et vérifier que ces derniers sont correctement définis.

Respecter les standards de code

Les standards de code sont très importants pour le travail en équipe car ils permettent d’uniformiser la manière dont les développeurs écrivent du code et facilite ainsi la lecture, la compréhension et la prise en main du projet.

Dans ce sens, plusieurs outils sont à la disposition du développeur. Le plus connu et plus ancien est certainement PHP_CodeSniffer. Il s’agit d’un ensemble de scripts qui vont analyser votre code PHP (mais aussi Javascript et CSS) afin de relever les violations de vos standards. En plus de la détection des erreurs, il sera possible de corriger automatiquement les erreurs détectées.

Dans le même esprit, il existe également PHP CS Fixer, un outil plus récent que le précédent et bénéficiant d’une gestion de la configuration plus « actuelle » afin d’éviter d’écrire de la configuration au format XML.

Tester la compatibilité avec une version de PHP

Proposé peu avant l’arrivée de PHP 7, php7cc est l’analyseur de code statique qui vous permettra de faciliter la migration de vos projets PHP 5 vers PHP 7. Une analyse de php7cc vous permettra de détecter les portions de votre code qui ne sont pas compatibles avec les dernières versions du langage et facilitera ainsi la transition vers la dernière branche majeure du langage.

Il existe également une solution nommée PHP CompatInfo qui est une librairie PHP qui va rechercher la version minimum du langage avec laquelle votre code est compatible.

Les solutions complètes

Il existe également des solutions plus complètes et qui permettent de regrouper l’ensemble des analyses citées précédemment. Ma solution préférée est certainement PhpMetrics, une des solution les plus récentes de ce billet.

PhpMetric, tout comme les outils précédents, permet d’analyser un projet pour obtenir des métriques sur la complexité et la maintenabilité du code. Le principal élément différenciateur de ce projet est qu’il se focalise sur les critères de qualité et fait un grand travail sur la présentation des résultats afin que ces derniers puissent être compris et interprétés par des développeurs de tout niveau au travers d’une interface agréable.

Un rapport de démo est disponible sur le site de l’outil afin de se faire une idée des capacités de ce dernier.

Notons également la présence de nombreuses autres solutions telles que SonarQube qui contrairement à l’ensemble des outils présentés jusqu’à maintenant, est un outil multilangage. Ce dernier est entre autres compatibles avec les langages tels que Java, C, C++, Objective-C, JavaScript, Python… Disponible dans une version open source, SonarSource l’éditeur de la solution propose également une version commerciale disponible en SaaS avec un support technique et proposant des analyses pour des langages tel que COBOL, Objective-C, Swift.

Parmi les autres outils existants, on peut également citer :

  • Scrutinizer, une solution propriétaire massivement utilisée pour analyser la qualité des projets open source
  • Sensiolabs Insight, le produit de la société Sensiolabs créatrice du framework Symfony
  • Exakat

Voilà qui conclut notre tour d’horizon des outils d’analyse de code statique. Notons que la plupart des outils évoqués s’intègrent très facilement dans les principaux IDE (PHPStorm, Eclipse, …) et éditeur de textes spécialisés (tels que SublimeText, Atom ou VSCode) de base ou au travers de leurs systèmes d’extensions.

Les solutions d’analyse statique sont nombreuses et il est souvent simple de les mettre en place pour obtenir les premiers rapports et indicateurs qui permettront d’améliorer la qualité d’un projet. Il est important de signaler que les résultats obtenus ne sont intéressants et pertinents que dans le contexte où ils sont mis en place.

Il est également intéressant de signaler, qu’il ne faut pas prendre les recommandations émises par ces outils comme étant une vérité absolue. Les analyses effectuées doivent être mises en place pour indiquer le chemin à suivre et fournir des indicateurs, elles ne remplacent en aucun cas l’expérience d’un développeur.