fbpx

L’Analyse statique en PHP : le concept et les solutions

php_depend_graph2

Dans cet article, Je vais exposer le concept de l’analyse statique de code et je vais présenter deux outils qui s’inscrivent dans ce cadre et dont l’utilisation est fortement recommandée pour vos équipes de développement et de qualité .

L’analyse Statique de code

La vie d’un script PHP se décompose en 2 espaces distincts : l’écriture et l’exécution. Entre les deux, il y a l’analyseur PHP, qui réalise la compilation et l’exécution du code initial, lors de la sollicitation des internautes. L’analyse statique a pour objectif d’étudier PHP avant la compilation, pour détecter très tôt des situations à problèmes. L’analyse s’appuie sur le code PHP avant exécution. Elle exploite des motifs de code pour reconnaître des situations : par exemple, une instruction echo ou print, appliquée à une concaténation des variables superglobales est un signe fort d’injection HTML. L’analyse statique permet d’obtenir des résultats avant exécution, et donc sans risque pour les données ou la plate-forme de production.

L’analyse statique doit être automatisée pour pouvoir être exécutée aussi souvent que possible, et notamment tout au long du développement. De cette manière, les erreurs sont traquées lorsque le code est peu volumineux, et les incréments faciles à corriger au fur et à mesure. L’automatisation donne aussi la maîtrise du processus de vérification aux développeurs et aux chefs de projets. Les premiers peuvent valider leur code eux-mêmes, sans passer trop de temps à implémenter les règles d’analyse ou à analyser le code PHP. C’est toujours une bonne idée que de ne pas être juge et partie dans ce type de surveillance. Pour les chefs de projets, le volume de code à analyser, dans l’absolu ou simplement après une période d’absence, a finalement peu d’impact sur les erreurs trouvées.

L’analyse statique doit être complétée par l’analyse dynamique, à l’aide de profileurs. En effet, le langage PHP est dynamique par essence : à l’exécution, il est possible de définir des classes, fonctions, variables et leur type, d’inclure ou exécuter du code PHP : tout cela modifie considérablement le fonctionnement du script si des valeurs mal intentionnées ou erronées sont introduites. L’analyse statique doit donc affronter l’ensemble des cas possibles, alors que l’exécution d’un script donne plutôt l’aperçu du comportement lorsque des valeurs concrètes sont affectées.

L’analyse statique de PHP en est à ses débuts. Il existe peu d’outils et la majorité des indicateurs sont issus des plates-formes concurrentes. Les spécificités de PHP, tels qu’une grande sensibilité aux inclusions de fichiers, sont rarement prises en compte pour des concepts issus des développements pour le bureau. Il reste donc beaucoup d’expérience à aller chercher sur le terrain. L’analyse statique pourra notamment aller chercher des jalons naturels dans le code, telles que les structures de classes, ou fonctions, afin d’identifier les dérives dans la programmation, ou la divergence avec la conception. Par exemple, des fonctions en trop, des fonctions qui ne suivent pas les conventions de nommage, ou encore des fonctions qui ne sont pas utilisées sont autant d’informations qui doivent être gérées dans une politique générale du projet, et qui sont rarement maîtrisées, faute d’outils pour faire un rapport accessible aux intervenants du projet qui ne font pas de la programmation.

Les outils

Il existe quelques outils pour mesurer divers indicateurs dans le code PHP. Je vais en presenter deux :

PHP_CodeSniffer

PHP_CodeSniffer est un script PHP5 qui analyse le code PHP, Javascript et CSS pour détecter des violations de standards de code. C’est un outil essentiel de développement qui assure que votre code reste propre et consistant. Il permet d’aider aussi de prévenir des erreurs sémantiques. PHP_CodeSniffer permet d’utiliser plusieurs standards comme ceux de PEAR ou de Zend, mais aussi, il vous permet d’écrire vos propres standards. PHP_CodeSniffer peut être aussi déployé ans votre processus d’intégration continue afin d’automatiser la procédure de tests de conformité aux standards.
Comme il est absurde pour une équipe de développement de travailler sans un outil de gestion de dépôt/versions/collaboration, il est de même pour cet outil.
Installation
1. Si PEAR est installe sur votre plate-forme, passez a l’étape 2.

$ curl http://pear.php.net/go-pear > go-pear.php
$ sudo php -q go-pear.php

2. Installez PHP_CodeSniffer ;

sudo pear install PHP_CodeSniffer

3. Testez votre installation
Les standards se trouvent normalement dans /usr/local/PEAR/PHP/CodeSniffer/Standards/

$ cd /usr/local/PEAR/
$ phpcs –i
The installed coding standards are PEAR, PHPCS, Squiz and Zend

4. Testez votre code :

phpcs --standard=PEAR /chemin/de/votre/fichier.php 

FILE: /chemin/de/votre/fichier.php
------------------------------------------------------
FOUND 2 ERROR(S) AND 0 WARNING(S) AFFECTING 2 LINE(S)
------------------------------------------------------
  44 | ERROR | The ? in tenary operator must have a space before and after
 180 | ERROR | A closing tag is not permitted at the end of a PHP file

PHP_Depend

Portage de JDepend, PHP_Depend est un programme qui effectue différentes métriques sur le code PHP avant sa compilation. Il utilise l’analyse statique de code pour définir les parties de code qui sont suspects a une revue de code, et par conséquent, il peut être très utile pour “automatiser” ces taches sur des projets de grande taille. Il permet aussi d’avoir des statistiques de code automatisées. PHP_Depend permet donc d’augmenter la productivité et la qualité de code des équipes de développement.

Installation

Tout comme PHP_CodeSniffer, PHP_Depend vient aussi comme package PEAR.
1. Découvrir le canal de PHP_Depend

pear channel-discover pear.pdepend.org

2. Installer PHP_Depend

pear install pdepend/PHP_Depend-beta

3. Après l’installation, vous pouvez placer vos fichiers sources a tester dans votre répertoire PEAR Local, PHP_Depend fournit des exemples de code source.

$ pear config-get php_dir
/usr/local/share/pear
$ ls /usr/local/share/pear/PHP
Depend Depend.php

4. Testez la version de PHP_Depend :

$ pdepend --version
PHP_Depend 0.9.4 by Manuel Pichler

5. Vous pouvez executer maintenant PHP_Depend sur les sources comme suit :

$ pdepend --summary-xml=/tmp/summary.xml \
--jdepend-chart=/tmp/jdepend.svg \
--overview-pyramid=/tmp/pyramid.svg \
/usr/local/share/pear/PHP/Depend

Le résultat est le suivant :

<?xml version=”1.0″ encoding=”UTF-8″?>
<metrics ahh=”0.19444444444444″ andc=”0.46268656716418″ calls=”1406″ ccn=”1203″ ccn2=”1237″ cloc=”11657″ clsa=”7″ clsc=”60″ eloc=”6528″ fanout=”571″ leafs=”59″ loc=”20078″ maxDIT=”2″ ncloc=”8421″ noc=”67″ nof=”0″ noi=”21″ nom=”578″ nop=”11″ roots=”5″>
<files>
<file name=”/usr/local/pear/PEAR/PHP/Depend/Parser.php” cloc=”324″ eloc=”534″ loc=”997″ ncloc=”673″/>
<file name=”/usr/local/pear/PEAR/PHP/Depend/StorageRegistry.php” cloc=”81″ eloc=”18″ loc=”103″ ncloc=”22″/>

</files>
<package name=”PHP_Depend” cr=”1.3005761647303″ noc=”3″ nof=”0″ noi=”4″ nom=”51″ rcr=”0.50515422957667″>
<class name=”PHP_Depend_Parser” cis=”12″ cloc=”250″ cr=”0.15″ csz=”113″ dit=”0″ eloc=”526″ impl=”1″ loc=”913″ ncloc=”663″ nom=”20″ rcr=”0.1925″ vars=”6″ varsi=”6″ varsnp=”0″ wmc=”107″ wmci=”107″ wmcnp=”12″>
<file name=”/usr/local/pear/PEAR/PHP/Depend/Parser.php”/>
<method name=”__construct” ccn=”1″ ccn2=”1″ cloc=”0″ eloc=”4″ loc=”6″ ncloc=”6″ npath=”1″/>
<method name=”_consumeComments” ccn=”3″ ccn2=”3″ cloc=”0″ eloc=”10″ loc=”12″ ncloc=”12″ npath=”3″/>

</class>
<class name=”PHP_Depend_StorageRegistry” cis=”3″ cloc=”25″ cr=”0.15″ csz=”4″ dit=”0″ eloc=”15″ impl=”0″ loc=”43″ ncloc=”18″ nom=”2″ rcr=”0.15″ vars=”1″ varsi=”1″ varsnp=”0″ wmc=”3″ wmci=”3″ wmcnp=”3″>
<file name=”/usr/local/pear/PEAR/PHP/Depend/StorageRegistry.php”/>
<method name=”get” ccn=”2″ ccn2=”2″ cloc=”0″ eloc=”7″ loc=”8″ ncloc=”8″ npath=”2″/>
<method name=”set” ccn=”1″ ccn2=”1″ cloc=”0″ eloc=”3″ loc=”4″ ncloc=”4″ npath=”1″/>
</class>

</package>

</metrics>

Les graphiques sont aussi générées, ils représentent les dépendances de code ainsi qu’un sommaire visuel du projet analysé.

php_depend_graph2

1. Graphe des dépendances

php_depend_graph1

2. Sommaire du projet

Ressources

  • PHP_CodeSniffer : http://pear.php.net/package/PHP_CodeSniffer/redirected
  • PHP_Depend : http://pdepend.org
  • L’analyse statique de code : http://www.alterway.fr/publications/livre-blanc-industrialisation-php

Anis Berejeb

Anis est avant tout un passioné de l'agilité et du développement. Avec plus de 15 ans dans le domaine du développement web, son expertise combine des connaissances accrues dans l'ensemble des notions partant du développement logiciel jusqu'à l'organisation des équipes dans les environnements agiles à grande échelle.

You may also like...