Statische Analyse von Java-Code
                             in der Praxis

                             Vortragsreihe Tools in der Softwareentwicklung

                              Roland Ewald




31. 5. 2012   c 2012   UNIVERSITÄT ROSTOCK | LEHRSTUHL FÜR MODELLIERUNG & SIMULATION (PROF. UHRMACHER)   1
Hintergrund

    •         Modellierungs- und Simulationsframework J AMES II
              (http://jamesii.org)
    •         Konzipiert von Jan Himmelspach; entwickelt über neun Jahre mit
              > 40 Leuten
    •         Zwar nicht groß für Industrieverhältnisse, aber auch nicht mehr trivial
              klein:
                 • 396.326 LoC
                 • 782.583 Zeilen insgesamt, in
                 • 6.699 Quelldateien (Stand: 24. 5. 2012 / Revision 28784)


31. 5. 2012    c 2012   UNIVERSITÄT ROSTOCK | LEHRSTUHL FÜR MODELLIERUNG & SIMULATION (PROF. UHRMACHER)   2
Warum statische Codeanalyse?

Sonar
   Eingebundene Werkzeuge
   Integration mit anderen Werkzeugen

Beispiele, Beispiele, Beispiele




31. 5. 2012   c 2012   UNIVERSITÄT ROSTOCK | LEHRSTUHL FÜR MODELLIERUNG & SIMULATION (PROF. UHRMACHER)   3
Warum statische Codeanalyse?




31. 5. 2012   c 2012   UNIVERSITÄT ROSTOCK | LEHRSTUHL FÜR MODELLIERUNG & SIMULATION (PROF. UHRMACHER)   4
The most important thing I have done as a programmer
              in recent years is to aggressively pursue static code
              analysis.
              Even more valuable than the hundreds of serious bugs I
              have prevented with it is the change in mindset about
              the way I view software reliability and code quality.


John Carmack
http://www.altdevblogaday.com/2011/12/24/static-code-analysis



31. 5. 2012    c 2012   UNIVERSITÄT ROSTOCK | LEHRSTUHL FÜR MODELLIERUNG & SIMULATION (PROF. UHRMACHER)   5
http://en.wikipedia.org/wiki/John_D._Carmack



31. 5. 2012   c 2012   UNIVERSITÄT ROSTOCK | LEHRSTUHL FÜR MODELLIERUNG & SIMULATION (PROF. UHRMACHER)   6
Was ist statische Codeanalyse?

    •         Code wird analysiert, ohne ihn auszuführen


    •         Meist automatisiert, d.h. durch Software
              (ansonsten: Code Review, z.B. http://codereview.stackexchange.com)


    •         Automatische Analyse ist schwer bzw. unmöglich
              (Satz von Rice, Halteproblem)


              ⇒ Heuristiken, Auffinden von Anti-Patterns, Metriken


31. 5. 2012    c 2012   UNIVERSITÄT ROSTOCK | LEHRSTUHL FÜR MODELLIERUNG & SIMULATION (PROF. UHRMACHER)   7
31. 5. 2012   c 2012   UNIVERSITÄT ROSTOCK | LEHRSTUHL FÜR MODELLIERUNG & SIMULATION (PROF. UHRMACHER)   8
Code-Metriken?


    •         Größe: z.B. Zeilen pro Datei/Klasse/Methode


    •         Komplexität: z.B. Anzahl Parameter pro Methode


    •         Dokumentation: z.B. Anzahl an Kommentaren


    •         Homogenität: z.B. Bennenung von Variablen




31. 5. 2012    c 2012   UNIVERSITÄT ROSTOCK | LEHRSTUHL FÜR MODELLIERUNG & SIMULATION (PROF. UHRMACHER)   9
Technical Debt




Photo: Andres Rueda / flickr.com




E. Allman: Managing technical debt. Commun. ACM, vol. 55, no. 5, pp. 50-55, May 2012.
http://dx.doi.org/10.1145/2160718.2160733
31. 5. 2012      c 2012       UNIVERSITÄT ROSTOCK | LEHRSTUHL FÜR MODELLIERUNG & SIMULATION (PROF. UHRMACHER)   10
Problem: Geschwindigkeit der Analyse


•     Viele Metriken sind wichtig

•     Laufzeit: mehrere Stunden

•     Lästig → wird ignoriert

•     Integration in den Arbeitsablauf

•     Continuous Inspection
                                                                           http://xkcd.com/303




    31. 5. 2012   c 2012   UNIVERSITÄT ROSTOCK | LEHRSTUHL FÜR MODELLIERUNG & SIMULATION (PROF. UHRMACHER)   11
(Open Source, kommerzielle Zusatzkomponenten)



                                                  http://www.sonarsource.com




31. 5. 2012   c 2012   UNIVERSITÄT ROSTOCK | LEHRSTUHL FÜR MODELLIERUNG & SIMULATION (PROF. UHRMACHER)   12
Sonar integriert existierende Werkzeuge


                                                                                         …




    •         PMD, CPD, Findbugs, Checkstyle, Clover, etc. ...
    •         Web-Anwendung (’lokale’ Installation einfach möglich)
    •         Außerdem: Historie, zusätzliche Metriken, Code Reviews
31. 5. 2012    c 2012   UNIVERSITÄT ROSTOCK | LEHRSTUHL FÜR MODELLIERUNG & SIMULATION (PROF. UHRMACHER)   13
http://nemo.sonarsource.org
31. 5. 2012   c 2012   UNIVERSITÄT ROSTOCK | LEHRSTUHL FÜR MODELLIERUNG & SIMULATION (PROF. UHRMACHER)   14
Integration ins Build-System




    •         Maven-Support: mvn sonar:sonar
              (Alternativ: Ant Task, „Java Runner“)
    •         Plug-in für Jenkins vorhanden
    •         E-Mail Benachrichtigungen bei ’Events’
31. 5. 2012    c 2012   UNIVERSITÄT ROSTOCK | LEHRSTUHL FÜR MODELLIERUNG & SIMULATION (PROF. UHRMACHER)   15
IDE Integration




    •         Plugins für Eclipse, IntelliJ IDEA, NetBeans (in der Entwicklung)
    •         Anzeige der Probleme im Editor, zusätzliche Filter
    •         Lokale Analyse möglich
    •         Code Reviews als Mylyn-Tasks einbindbar

31. 5. 2012    c 2012   UNIVERSITÄT ROSTOCK | LEHRSTUHL FÜR MODELLIERUNG & SIMULATION (PROF. UHRMACHER)   16
Beispiele1,2,3
                                                        1 — Beispiele sind von mir.


                                                     2 — Oder ausgedacht/adaptiert.


                                         3 — Wenn ausgedacht: in der Form schon mal gefunden.




31. 5. 2012   c 2012   UNIVERSITÄT ROSTOCK | LEHRSTUHL FÜR MODELLIERUNG & SIMULATION (PROF. UHRMACHER)   17
Wo ist das Problem?
 1   //...
 2   public class PerfDBImplementation implements IPerformanceDatabase {
 3
 4       /**
 5        * Performance database to be used
 6        */
 7       PerformanceDatabase perf_db = null;
 8
 9       public void init(DBConnectionData dbConn) throws Exception {
10         perf_db = new PerformanceDatabase(dbConn);
11         Object[] params = null;
12         perf_db.createBase(params);
13       }
14
15   //...
16   }



     31. 5. 2012   c 2012   UNIVERSITÄT ROSTOCK | LEHRSTUHL FÜR MODELLIERUNG & SIMULATION (PROF. UHRMACHER)   18
Wo ist das Problem?
 1   //...
 2   public class FilePerformanceExtractor extends
           AbstractPerformanceExtractor {
 3     /** The delimiter for creating the output file. */
 4     private final char DELIMITER = 't';
 5     //...
 6     private void writeToFile(StringBuilder stringBuilder, String
             fileName) {
 7       BufferedWriter writer = null;
 8       try {
 9          writer = new BufferedWriter(new FileWriter(fileName));
10          writer.append(stringBuilder);
11       } catch (Throwable t) {
12          t.printStackTrace();
13       }
14     }
15   //...
16   }

     31. 5. 2012   c 2012   UNIVERSITÄT ROSTOCK | LEHRSTUHL FÜR MODELLIERUNG & SIMULATION (PROF. UHRMACHER)   19
Wo ist das Problem?
 1   protected BenchmarkModel getEntityByResultSet(ResultSet rs) throws
          Exception {
 2     return new BenchmarkModel(new URI(rs.getString(2)), rs.getString(3),
 3           rs.getString(4), rs.getString(5));
 4   }
 5   //...
 6   public PortfolioPerformanceData(Double[][] perfMatrix,
 7         SelectionTree[] configs) {
 8     performances = perfMatrix;
 9     configurations = configs;
10   }
11   //...
12   public interface IBogusSimulatorProperties extends Serializable {
13     //...
14     final Integer DEFAULT = 1;
15     //...
16     public int getLoadPerSteps(Map<String, Serializable> modelContent);
17   }

     31. 5. 2012   c 2012   UNIVERSITÄT ROSTOCK | LEHRSTUHL FÜR MODELLIERUNG & SIMULATION (PROF. UHRMACHER)   20
Wo ist das Problem?
 1   class FooBar implements Serializable {
 2   //...
 3
 4   public static final String DATABASE_PWD = "kommtIhrNieDrauf";
 5
 6   private FileReader fileReader;
 7
 8   private HashMap<String, Serializable> value = new HashMap<String,
          Serializable>();
 9
10   ReplicatedSimExecThread repThread = (ReplicatedSimExecThread) thread;
11
12   Vector<Integer> bestAlgorithms = new Vector<Integer>();
13
14   //...
15   }



     31. 5. 2012   c 2012   UNIVERSITÄT ROSTOCK | LEHRSTUHL FÜR MODELLIERUNG & SIMULATION (PROF. UHRMACHER)   21
Was noch gefunden werden kann...

    •         Unsaubere Multi-Thread Programmierung
              Inconsistent synchronization of x.y.z.foo; locked 83% of time


    •         Manchmal: Endlosschleifen
              Ansonsten mit //NOSONAR Entwarnung geben.


    •         Duplikationen
              Auch über mehrere Projekte.


    •         Klassen, die das Single-Responsibility-Prinzip verletzen
              Momentan: LCOM4.


    •         Zirkuläre Abhängigkeiten zwischen Paketen


31. 5. 2012     c 2012   UNIVERSITÄT ROSTOCK | LEHRSTUHL FÜR MODELLIERUNG & SIMULATION (PROF. UHRMACHER)   22
Was noch gefunden werden kann...


    •         Ungenutzte Variablen
    •         Zu wenig geschweifte Klammern
    •         Einrückungen mit <TAB> (→ Versionskontrolle!)
    •         equals() & hashCode()
    •         Redundante null/instanceof-checks, redundanter Kontrollfluss,
              Nullpointer-Dereferenzen
    •         == vs. equals()



31. 5. 2012    c 2012   UNIVERSITÄT ROSTOCK | LEHRSTUHL FÜR MODELLIERUNG & SIMULATION (PROF. UHRMACHER)   23
Zusammenfassung: Statische Codeanalyse ...


•   hilft typische Bugs zu finden
    und zu vermeiden

•   ist automatisierbar

•   sollte in bestehende
    Arbeitsabläufe integriert werden

•   erfasst Technical Debt


                                                                                                               Photo: OnFoot4now (Didi) / flickr.com

      31. 5. 2012   c 2012   UNIVERSITÄT ROSTOCK | LEHRSTUHL FÜR MODELLIERUNG & SIMULATION (PROF. UHRMACHER)                                          24
Studenten gesucht:JAMES II weiterentwickeln und
Erfahrung sammeln mit...




31. 5. 2012   c 2012   UNIVERSITÄT ROSTOCK | LEHRSTUHL FÜR MODELLIERUNG & SIMULATION (PROF. UHRMACHER)   25
Dieses Werk ist unter einer Creative Commons Lizenz vom Typ Namensnennung 3.0 Deutschland zugänglich. Um eine Kopie dieser Lizenz

    einzusehen, konsultieren Sie http://creativecommons.org/licenses/by/3.0/de/ oder wenden Sie sich brieflich an

                         Creative Commons, 444 Castro Street, Suite 900, Mountain View, California, 94041, USA.




31. 5. 2012   c 2012   UNIVERSITÄT ROSTOCK | LEHRSTUHL FÜR MODELLIERUNG & SIMULATION (PROF. UHRMACHER)                              26
Noch mehr Beispiele




31. 5. 2012   c 2012   UNIVERSITÄT ROSTOCK | LEHRSTUHL FÜR MODELLIERUNG & SIMULATION (PROF. UHRMACHER)   27
Wo ist das Problem?



1   if ((elem.getLong(2) == id) && (elem.getDouble(3) == time))
2   //...
3   MyState pState = null;
4   try {
5   pState = (MyState) proc.getState();
6   } catch (Exception e) {
7     e.printStackTrace();
8   }
9   pState.setMediator(new Mediator());




    31. 5. 2012   c 2012   UNIVERSITÄT ROSTOCK | LEHRSTUHL FÜR MODELLIERUNG & SIMULATION (PROF. UHRMACHER)   28
Wo ist das Problem?



1   public int compare(Map<String, Double> list1, Map<String, Double>
          list2) {
2     for (int i = 0; i < list1.size(); i++) {
3       if (list1.get(i) < list2.get(i)) {
4       //...
5       }
6     }
7   }




    31. 5. 2012   c 2012   UNIVERSITÄT ROSTOCK | LEHRSTUHL FÜR MODELLIERUNG & SIMULATION (PROF. UHRMACHER)   29
Wo ist das Problem?



1   Object input = port.read();
2   if (input instanceof Boolean) {
3     Boolean move = (Boolean) input;
4     if (phase == ACTIVE) {
5       if ((move != null) && move) {
6       //...
7       }
8     }
9   }




    31. 5. 2012   c 2012   UNIVERSITÄT ROSTOCK | LEHRSTUHL FÜR MODELLIERUNG & SIMULATION (PROF. UHRMACHER)   30
Wo ist das Problem?


 1   //...
 2   ExampleComponent c = manager.getComponentForExample(o);
 3   if (c == null) {
 4     Connection con = manager.getComponentForConnection(o);
 5     con.call();
 6     if (con == null) {
 7          //...
 8     }
 9   } else {
10     c.call();
11   }




     31. 5. 2012   c 2012   UNIVERSITÄT ROSTOCK | LEHRSTUHL FÜR MODELLIERUNG & SIMULATION (PROF. UHRMACHER)   31

Statische Analyse von Java-Code in der Praxis

  • 1.
    Statische Analyse vonJava-Code in der Praxis Vortragsreihe Tools in der Softwareentwicklung Roland Ewald 31. 5. 2012 c 2012 UNIVERSITÄT ROSTOCK | LEHRSTUHL FÜR MODELLIERUNG & SIMULATION (PROF. UHRMACHER) 1
  • 2.
    Hintergrund • Modellierungs- und Simulationsframework J AMES II (http://jamesii.org) • Konzipiert von Jan Himmelspach; entwickelt über neun Jahre mit > 40 Leuten • Zwar nicht groß für Industrieverhältnisse, aber auch nicht mehr trivial klein: • 396.326 LoC • 782.583 Zeilen insgesamt, in • 6.699 Quelldateien (Stand: 24. 5. 2012 / Revision 28784) 31. 5. 2012 c 2012 UNIVERSITÄT ROSTOCK | LEHRSTUHL FÜR MODELLIERUNG & SIMULATION (PROF. UHRMACHER) 2
  • 3.
    Warum statische Codeanalyse? Sonar Eingebundene Werkzeuge Integration mit anderen Werkzeugen Beispiele, Beispiele, Beispiele 31. 5. 2012 c 2012 UNIVERSITÄT ROSTOCK | LEHRSTUHL FÜR MODELLIERUNG & SIMULATION (PROF. UHRMACHER) 3
  • 4.
    Warum statische Codeanalyse? 31.5. 2012 c 2012 UNIVERSITÄT ROSTOCK | LEHRSTUHL FÜR MODELLIERUNG & SIMULATION (PROF. UHRMACHER) 4
  • 5.
    The most importantthing I have done as a programmer in recent years is to aggressively pursue static code analysis. Even more valuable than the hundreds of serious bugs I have prevented with it is the change in mindset about the way I view software reliability and code quality. John Carmack http://www.altdevblogaday.com/2011/12/24/static-code-analysis 31. 5. 2012 c 2012 UNIVERSITÄT ROSTOCK | LEHRSTUHL FÜR MODELLIERUNG & SIMULATION (PROF. UHRMACHER) 5
  • 6.
    http://en.wikipedia.org/wiki/John_D._Carmack 31. 5. 2012 c 2012 UNIVERSITÄT ROSTOCK | LEHRSTUHL FÜR MODELLIERUNG & SIMULATION (PROF. UHRMACHER) 6
  • 7.
    Was ist statischeCodeanalyse? • Code wird analysiert, ohne ihn auszuführen • Meist automatisiert, d.h. durch Software (ansonsten: Code Review, z.B. http://codereview.stackexchange.com) • Automatische Analyse ist schwer bzw. unmöglich (Satz von Rice, Halteproblem) ⇒ Heuristiken, Auffinden von Anti-Patterns, Metriken 31. 5. 2012 c 2012 UNIVERSITÄT ROSTOCK | LEHRSTUHL FÜR MODELLIERUNG & SIMULATION (PROF. UHRMACHER) 7
  • 8.
    31. 5. 2012 c 2012 UNIVERSITÄT ROSTOCK | LEHRSTUHL FÜR MODELLIERUNG & SIMULATION (PROF. UHRMACHER) 8
  • 9.
    Code-Metriken? • Größe: z.B. Zeilen pro Datei/Klasse/Methode • Komplexität: z.B. Anzahl Parameter pro Methode • Dokumentation: z.B. Anzahl an Kommentaren • Homogenität: z.B. Bennenung von Variablen 31. 5. 2012 c 2012 UNIVERSITÄT ROSTOCK | LEHRSTUHL FÜR MODELLIERUNG & SIMULATION (PROF. UHRMACHER) 9
  • 10.
    Technical Debt Photo: AndresRueda / flickr.com E. Allman: Managing technical debt. Commun. ACM, vol. 55, no. 5, pp. 50-55, May 2012. http://dx.doi.org/10.1145/2160718.2160733 31. 5. 2012 c 2012 UNIVERSITÄT ROSTOCK | LEHRSTUHL FÜR MODELLIERUNG & SIMULATION (PROF. UHRMACHER) 10
  • 11.
    Problem: Geschwindigkeit derAnalyse • Viele Metriken sind wichtig • Laufzeit: mehrere Stunden • Lästig → wird ignoriert • Integration in den Arbeitsablauf • Continuous Inspection http://xkcd.com/303 31. 5. 2012 c 2012 UNIVERSITÄT ROSTOCK | LEHRSTUHL FÜR MODELLIERUNG & SIMULATION (PROF. UHRMACHER) 11
  • 12.
    (Open Source, kommerzielleZusatzkomponenten) http://www.sonarsource.com 31. 5. 2012 c 2012 UNIVERSITÄT ROSTOCK | LEHRSTUHL FÜR MODELLIERUNG & SIMULATION (PROF. UHRMACHER) 12
  • 13.
    Sonar integriert existierendeWerkzeuge … • PMD, CPD, Findbugs, Checkstyle, Clover, etc. ... • Web-Anwendung (’lokale’ Installation einfach möglich) • Außerdem: Historie, zusätzliche Metriken, Code Reviews 31. 5. 2012 c 2012 UNIVERSITÄT ROSTOCK | LEHRSTUHL FÜR MODELLIERUNG & SIMULATION (PROF. UHRMACHER) 13
  • 14.
    http://nemo.sonarsource.org 31. 5. 2012 c 2012 UNIVERSITÄT ROSTOCK | LEHRSTUHL FÜR MODELLIERUNG & SIMULATION (PROF. UHRMACHER) 14
  • 15.
    Integration ins Build-System • Maven-Support: mvn sonar:sonar (Alternativ: Ant Task, „Java Runner“) • Plug-in für Jenkins vorhanden • E-Mail Benachrichtigungen bei ’Events’ 31. 5. 2012 c 2012 UNIVERSITÄT ROSTOCK | LEHRSTUHL FÜR MODELLIERUNG & SIMULATION (PROF. UHRMACHER) 15
  • 16.
    IDE Integration • Plugins für Eclipse, IntelliJ IDEA, NetBeans (in der Entwicklung) • Anzeige der Probleme im Editor, zusätzliche Filter • Lokale Analyse möglich • Code Reviews als Mylyn-Tasks einbindbar 31. 5. 2012 c 2012 UNIVERSITÄT ROSTOCK | LEHRSTUHL FÜR MODELLIERUNG & SIMULATION (PROF. UHRMACHER) 16
  • 17.
    Beispiele1,2,3 1 — Beispiele sind von mir. 2 — Oder ausgedacht/adaptiert. 3 — Wenn ausgedacht: in der Form schon mal gefunden. 31. 5. 2012 c 2012 UNIVERSITÄT ROSTOCK | LEHRSTUHL FÜR MODELLIERUNG & SIMULATION (PROF. UHRMACHER) 17
  • 18.
    Wo ist dasProblem? 1 //... 2 public class PerfDBImplementation implements IPerformanceDatabase { 3 4 /** 5 * Performance database to be used 6 */ 7 PerformanceDatabase perf_db = null; 8 9 public void init(DBConnectionData dbConn) throws Exception { 10 perf_db = new PerformanceDatabase(dbConn); 11 Object[] params = null; 12 perf_db.createBase(params); 13 } 14 15 //... 16 } 31. 5. 2012 c 2012 UNIVERSITÄT ROSTOCK | LEHRSTUHL FÜR MODELLIERUNG & SIMULATION (PROF. UHRMACHER) 18
  • 19.
    Wo ist dasProblem? 1 //... 2 public class FilePerformanceExtractor extends AbstractPerformanceExtractor { 3 /** The delimiter for creating the output file. */ 4 private final char DELIMITER = 't'; 5 //... 6 private void writeToFile(StringBuilder stringBuilder, String fileName) { 7 BufferedWriter writer = null; 8 try { 9 writer = new BufferedWriter(new FileWriter(fileName)); 10 writer.append(stringBuilder); 11 } catch (Throwable t) { 12 t.printStackTrace(); 13 } 14 } 15 //... 16 } 31. 5. 2012 c 2012 UNIVERSITÄT ROSTOCK | LEHRSTUHL FÜR MODELLIERUNG & SIMULATION (PROF. UHRMACHER) 19
  • 20.
    Wo ist dasProblem? 1 protected BenchmarkModel getEntityByResultSet(ResultSet rs) throws Exception { 2 return new BenchmarkModel(new URI(rs.getString(2)), rs.getString(3), 3 rs.getString(4), rs.getString(5)); 4 } 5 //... 6 public PortfolioPerformanceData(Double[][] perfMatrix, 7 SelectionTree[] configs) { 8 performances = perfMatrix; 9 configurations = configs; 10 } 11 //... 12 public interface IBogusSimulatorProperties extends Serializable { 13 //... 14 final Integer DEFAULT = 1; 15 //... 16 public int getLoadPerSteps(Map<String, Serializable> modelContent); 17 } 31. 5. 2012 c 2012 UNIVERSITÄT ROSTOCK | LEHRSTUHL FÜR MODELLIERUNG & SIMULATION (PROF. UHRMACHER) 20
  • 21.
    Wo ist dasProblem? 1 class FooBar implements Serializable { 2 //... 3 4 public static final String DATABASE_PWD = "kommtIhrNieDrauf"; 5 6 private FileReader fileReader; 7 8 private HashMap<String, Serializable> value = new HashMap<String, Serializable>(); 9 10 ReplicatedSimExecThread repThread = (ReplicatedSimExecThread) thread; 11 12 Vector<Integer> bestAlgorithms = new Vector<Integer>(); 13 14 //... 15 } 31. 5. 2012 c 2012 UNIVERSITÄT ROSTOCK | LEHRSTUHL FÜR MODELLIERUNG & SIMULATION (PROF. UHRMACHER) 21
  • 22.
    Was noch gefundenwerden kann... • Unsaubere Multi-Thread Programmierung Inconsistent synchronization of x.y.z.foo; locked 83% of time • Manchmal: Endlosschleifen Ansonsten mit //NOSONAR Entwarnung geben. • Duplikationen Auch über mehrere Projekte. • Klassen, die das Single-Responsibility-Prinzip verletzen Momentan: LCOM4. • Zirkuläre Abhängigkeiten zwischen Paketen 31. 5. 2012 c 2012 UNIVERSITÄT ROSTOCK | LEHRSTUHL FÜR MODELLIERUNG & SIMULATION (PROF. UHRMACHER) 22
  • 23.
    Was noch gefundenwerden kann... • Ungenutzte Variablen • Zu wenig geschweifte Klammern • Einrückungen mit <TAB> (→ Versionskontrolle!) • equals() & hashCode() • Redundante null/instanceof-checks, redundanter Kontrollfluss, Nullpointer-Dereferenzen • == vs. equals() 31. 5. 2012 c 2012 UNIVERSITÄT ROSTOCK | LEHRSTUHL FÜR MODELLIERUNG & SIMULATION (PROF. UHRMACHER) 23
  • 24.
    Zusammenfassung: Statische Codeanalyse... • hilft typische Bugs zu finden und zu vermeiden • ist automatisierbar • sollte in bestehende Arbeitsabläufe integriert werden • erfasst Technical Debt Photo: OnFoot4now (Didi) / flickr.com 31. 5. 2012 c 2012 UNIVERSITÄT ROSTOCK | LEHRSTUHL FÜR MODELLIERUNG & SIMULATION (PROF. UHRMACHER) 24
  • 25.
    Studenten gesucht:JAMES IIweiterentwickeln und Erfahrung sammeln mit... 31. 5. 2012 c 2012 UNIVERSITÄT ROSTOCK | LEHRSTUHL FÜR MODELLIERUNG & SIMULATION (PROF. UHRMACHER) 25
  • 26.
    Dieses Werk istunter einer Creative Commons Lizenz vom Typ Namensnennung 3.0 Deutschland zugänglich. Um eine Kopie dieser Lizenz einzusehen, konsultieren Sie http://creativecommons.org/licenses/by/3.0/de/ oder wenden Sie sich brieflich an Creative Commons, 444 Castro Street, Suite 900, Mountain View, California, 94041, USA. 31. 5. 2012 c 2012 UNIVERSITÄT ROSTOCK | LEHRSTUHL FÜR MODELLIERUNG & SIMULATION (PROF. UHRMACHER) 26
  • 27.
    Noch mehr Beispiele 31.5. 2012 c 2012 UNIVERSITÄT ROSTOCK | LEHRSTUHL FÜR MODELLIERUNG & SIMULATION (PROF. UHRMACHER) 27
  • 28.
    Wo ist dasProblem? 1 if ((elem.getLong(2) == id) && (elem.getDouble(3) == time)) 2 //... 3 MyState pState = null; 4 try { 5 pState = (MyState) proc.getState(); 6 } catch (Exception e) { 7 e.printStackTrace(); 8 } 9 pState.setMediator(new Mediator()); 31. 5. 2012 c 2012 UNIVERSITÄT ROSTOCK | LEHRSTUHL FÜR MODELLIERUNG & SIMULATION (PROF. UHRMACHER) 28
  • 29.
    Wo ist dasProblem? 1 public int compare(Map<String, Double> list1, Map<String, Double> list2) { 2 for (int i = 0; i < list1.size(); i++) { 3 if (list1.get(i) < list2.get(i)) { 4 //... 5 } 6 } 7 } 31. 5. 2012 c 2012 UNIVERSITÄT ROSTOCK | LEHRSTUHL FÜR MODELLIERUNG & SIMULATION (PROF. UHRMACHER) 29
  • 30.
    Wo ist dasProblem? 1 Object input = port.read(); 2 if (input instanceof Boolean) { 3 Boolean move = (Boolean) input; 4 if (phase == ACTIVE) { 5 if ((move != null) && move) { 6 //... 7 } 8 } 9 } 31. 5. 2012 c 2012 UNIVERSITÄT ROSTOCK | LEHRSTUHL FÜR MODELLIERUNG & SIMULATION (PROF. UHRMACHER) 30
  • 31.
    Wo ist dasProblem? 1 //... 2 ExampleComponent c = manager.getComponentForExample(o); 3 if (c == null) { 4 Connection con = manager.getComponentForConnection(o); 5 con.call(); 6 if (con == null) { 7 //... 8 } 9 } else { 10 c.call(); 11 } 31. 5. 2012 c 2012 UNIVERSITÄT ROSTOCK | LEHRSTUHL FÜR MODELLIERUNG & SIMULATION (PROF. UHRMACHER) 31