Title: PMD
1PMD
- static source code analysis
2PMD communicatie protocol
3Inleiding
- Wat is PMD
- Wat voor soort fouten worden ontdekt
- Hoe werkt PMD
- Wat kan PMD voor Webstraat betekenen
4Wat is PMD
- JavaSourceCode scanner/static analysis
- Zoekt naar potentiële problemen
- Lege try/catch/if etc
- Niet gebruikte variables
- Te complexe expressies
- JCCN, copy/pasta
- Rapporteert
- Geeft aan hoe het wel moet
5Wat voor soort fouten?
- Current bugs
- Latent bugs -gt millennium bug
- Accident-waiting-to-happen bugs
- Poorly organized bugs
6Waar is fout
- 1 public static void main(String args)
- 2
- 3 System.out.println(toUpperCase('q'))
- 4
- 5
- 6 private static char toUpperCase(char main)
- 7
- 8 return (char) (main - 31)
- 9
7Waar is fout 2
- 1 public static void main(String args)
- 2
- 3 System.out.println(toUpperCase('q'))
- 4
- 5
- 6 private static char toUpperCase(char main)
- 7
- 8 return (char) (main - 31)
- 9
8Hoe werkt PMD
- Abstract Syntax Tree
- Rules set
- Commandline / Ant task
- Eclipse plugin
- CPD
9Abstract Syntax Tree
Java Source
JavaCC
JJTree
AST
EBNF
10Abstract Syntax Tree 2
CompilationUnit TypeDeclaration
ClassDeclaration UnmodifiedClassDeclaration
ClassBody ClassBodyDeclaration
MethodDeclaration ResultType
MethodDeclarator FormalParameters
Block BlockStatement Statement
StatementExpression
PrimaryExpression PrimaryPrefix
Name .
- public class Foo
- public void bar()
- System.out.println("hello world")
-
11Rules
- Rule is Visitor dat inspecteert AST
- Rules in Java
- Xpath rule
- Built-in rules
- Ernstigheid level 1 t/m 5
12Java Rule
// Extend AbstractRule to enable the Visitor
pattern public class EmptyIfStmtRule extends
AbstractRule implements Rule // This method
gets called when there's a Block in the source
code public Object visit(ASTBlock node, Object
data) // If the parent node is an If statement
and there isn't anything // inside the block if
((node.jjtGetParent().jjtGetParent() instanceof
ASTIfStatement) node.jjtGetNumChildren()0)
// then there's a problem, so add a
RuleViolation to the Report RuleContext ctx
(RuleContext)data ctx.getReport().addRuleViolatio
n(createRuleViolation(ctx, node.getBeginLine()))
// Now move on to the next node in the tree
return super.visit(node, data)
13Xpath rule
- AST is XML like
- Maak een Xpath expressie
- Voorbeeld Korte methode naam
//MethodDeclaratorstring-length(_at_Image) lt 3
14Built-in rules
- Basic
- Naming
- Unused code
- Design
- Code size
- Coupling
- Jccn
- Java beans
15Commandline / Ant task
- pmd Unused1.java xml rulesets/unusedcode.xml
lttarget name"pmd"gt lttaskdef name"pmd
classname"net.sourceforge.pmd.ant.PMDTask"/gt
ltpmd rulesetfiles"rulesets/imports.xml,ruleset
s/unusedcode.xml"gt ltformatter type"xml"
toFile"c\pmd_report.xml"/gt ltfileset
dir"C\j2sdk1.4.1_01\src\java\lang\"gt ltinclude
name"/.java"/gt lt/filesetgt lt/pmdgt
lt/targetgt
16Eclipse plugin
- Per project een ruleset en workingset
- PMD validatie per CU mogelijk
- Level 1 en 2 compile error
- Level 3 warrning
- Level 4 en 5 information
- PMD view
- CPD
- AST
17Wats in it for me?
- Gebruik van built-in ruleset
- Webstraat naamgeving conventie
- Webstraat Standaarden rules maken
- Project implementatie richtlijnen rules
18Wats in it for me?2
- Continue automatisch review doen
- Fouten worden voorkomen ipv herstelen
- PMD help ontwikkelaar om rule (afsprak) te
begrijpen/nakomen. - Overzicht van source code kwaliteit.
- Ruleset blijven uitbreiden op team/wsadproject/pro
ject/webstraat niveau.
19Vragen ?
- Liever niet, ga zelf kijken op http//pmd.sourcefo
rge.net