Analyse statique avec PMD
Simon Allier([email protected])
José Á. Galindo([email protected])
Last update 22 septembre 2015
1 Présentation de PMD
PMD 1est un rule checker qui permet de vérifier statiquement qu’un projet ne viole
pas un ensemble de règles. PMD fournit plus de 300 règles regroupées en ruleSets. Par
exemple, toutes les règles liées à l’utilisation des String dans java se trouvent dans le
ruleSet java-strings.
Dans le repo de Github vous trouverez les sources de PMD, un projet maven pour les
compiler et un exemple de règle (vv.tp3.WhileLoopsMustUseBracesRule). Pour impor-
ter le projet dans Eclipse : File Import. . . Existing Maven Projects.
1.1 Utilisation
Utilisation de PMD à partir du jar créé avec maven (goals package) :
java -cp .:target/pmd-5.0.5-jar-with-dependencies.jar
net.sourceforge.pmd.PMD -d src/main/java/
-R java-basic,java-design,java-unusedcode,java-optimizations,
java-empty,java-strictexception,java-strings
-f vbhtml -r report.html
Cette commande exécute les ruleSets java-basic, java-design, java-unusedcode,
java-optimizations, java-empty, java-strictexception, java-strings sur toutes
les classes présentes dans le répertoire de source src/main/java/. Un rapport au format
html est généré.
1.2 Extension de PMD
PMD permet de facilement ajouter de nouvelles règles. Les nouvelles règles doivent hé-
riter de la classe net.sourceforge.pmd.lang.java.rule.AbstractJavaRule et redéfi-
nir une ou plusieurs méthodes visit(ASTStatement node, Object data). De plus, tous
les objets node implémentent l’interface net.sourceforge.pmd.lang.ast.Node. Celle-ci
fournit des méthodes utiles pour écrire les règles. Enfin, les règles doivent être décrites
dans un ruleSet.
1. http ://pmd.sourceforge.net/
1
Un tutoriel se trouve à l’adresse suivante :
http://pmd.sourceforge.net/pmd-5.0.5/howtowritearule.html.
1.3 Exemple de règle « chaque while doit avoir des accolades »
On définit une règle autorisant uniquement les boucles while faisant usage d’accolades.
La figure 1 contient la classe définissant cette règle, et la figure 2 contient le fichier de
configuration du ruleSet contenant cette règle.
Boucle while correcte :
while ( baz ) {
buz . d o So m et h in g () ;
}
Boucle while incorrecte :
while ( baz )
buz . d o So m et h in g () ;
Commande pour utiliser cette règle : java -cp .:target/pmd-5.0.5-jar-with-dependencies.jar
net.sourceforge.pmd.PMD -d src/main/java/ -R src/main/resources/rulesets/java/VVRulesSet.xml
2 Questions
Question 1 Appliquez PMD sur le package simpleGame du tp2. Pour chaque violation
de règle de la classe Board, vous devez :
proposer un fix ;
ou expliquer pourquoi cette violation est un faux positif.
Question 2 Appliquez PMD sur ses propres sources. Qu’observez-vous ?
Question 3 Ecrivez les trois règles suivantes :
1. Une violation est levée dès que deux boucles for sont imbriquées.
2. Une violation est levée pour chaque while(true) ou while(false).
3. Raffinez la règle précédente en prenant en compte les possibilités d’échappement
(break ou return) dans la boucle while.
Ces règles doivent appartenir au package vv.tp3 et elles doivent être ajoutées au rulesSet
src/main/resources/rulesets/java/VVRulesSet.xml.
3 Rapport
Vous devez rendre :
Un rapport au format PDF contenant les réponses aux questions 1 et 2.
Un zip contenant :
la classe Board corrigée à l’aide de PMD ;
les 3 classes implémentant les règles de la question 3.
2
package vv . t p3 ;
import net . so urce fo rge . pmd . lang . ast . N ode ;
import net . so urce fo rge . pmd . lang . java . ast .*;
import net . so urce fo rge . pmd . lang . java . rule . A bst ra ct Ja vaR ule ;
publ ic c l a s s WhileLoopsMustUseBracesRule extends AbstractJavaRule {
public Obje ct vi sit ( A ST Whi leS tate men t node , O bj ec t data ) {
Node fir st St mt ;
fir stStm t = ( Node ) node . jj tG etC hi ld (1) ;
i f (! h asBl ock As Firs tCh i ld ( fir st St mt )) {
// ajout de la v io alt io n
a dd V iol ati on ( data , no de ) ;
}
return super . visit ( node , d ata ) ;
}
priva te boolean hasBlockAsFirstChild(Node node) {
return ( node . j jtG et Nu mC hil dre n () != 0 && ( no de . j jtG et Chi ld (0)
instanceof AST Bl oc k ));
}
}
Figure 1 – La classe qui implémente la règle while
<! -- src / main / r esou rc es / r ul es ets / java / V VRul esSe t . xml -->
<? xml v ersi on =" 1.0 " ?>
<ruleset name="VVRules"
xmlns = " http :// pmd . s our cef or ge . n et / r ulese t / 2.0.0 "
xmlns : x si = " http : // www . w3 . org / 2001/ X ML Sc he ma - in st ance "
xsi : s che ma Lo ca ti on = " ht tp :// pmd . s ou rce forg e . net / ru le set /2 .0 .0 h tt p :// pmd .
so urce forg e . net / r ul es et_2 _0_ 0 . xs d ">
< rule n am e = " W h i le Lo op sM us tU se Br ac es Ru le "
m es sag e = " Avoi d usi ng ’ w hile s t at e me n ts wi th out c ur ly b rac es "
c l a s s = " vv . t p3 . W hi le Lo op sM us t Us eB ra ce sR u le " >
<description >
Avo id u si ng ’ w hi le s ta t em e nt s w it ho ut u sing c urly b ra ces
</description >
<priority >3</priority >
< exampl e >
<![ CDAT A [
public void d oSo met hing () {
while (x < 100)
x ++;
}
]] >
</ example >
</ rul e >
</ ruleset >
Figure 2 – Le fichier de configuration du ruleSet pour la règle while
3
1 / 3 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !