SlideShare uma empresa Scribd logo
1 de 31
Baixar para ler offline
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

Mais conteúdo relacionado

Semelhante a Statische Analyse von Java-Code in der Praxis

Vorgehensmodelle - Methoden der Wirtschaftsinformatik
Vorgehensmodelle - Methoden der WirtschaftsinformatikVorgehensmodelle - Methoden der Wirtschaftsinformatik
Vorgehensmodelle - Methoden der WirtschaftsinformatikClaus Brell
 
Puppet - Module entwickeln - Von der Planung bis zur Umsetzung
Puppet - Module entwickeln - Von der Planung bis zur UmsetzungPuppet - Module entwickeln - Von der Planung bis zur Umsetzung
Puppet - Module entwickeln - Von der Planung bis zur Umsetzunginovex GmbH
 
Best Practices für TDD in JavaScript
Best Practices für TDD in JavaScriptBest Practices für TDD in JavaScript
Best Practices für TDD in JavaScriptSebastian Springer
 
Top 10 Internet Trends 2001
Top 10 Internet Trends 2001Top 10 Internet Trends 2001
Top 10 Internet Trends 2001Jürg Stuker
 
Tools zur Diagnose von Weblogic Performanceengpässen und Fehlerzuständen
Tools zur Diagnose von Weblogic Performanceengpässen und FehlerzuständenTools zur Diagnose von Weblogic Performanceengpässen und Fehlerzuständen
Tools zur Diagnose von Weblogic Performanceengpässen und FehlerzuständenOPITZ CONSULTING Deutschland
 
Sdv 0405 design-pattern_thc_jps_skript
Sdv 0405 design-pattern_thc_jps_skriptSdv 0405 design-pattern_thc_jps_skript
Sdv 0405 design-pattern_thc_jps_skriptTomasz Waszczyk
 
Sdv 0405 design-pattern_thc_jps_skript
Sdv 0405 design-pattern_thc_jps_skriptSdv 0405 design-pattern_thc_jps_skript
Sdv 0405 design-pattern_thc_jps_skriptTomasz Waszczyk
 
FMK2012: Programmstrukturen - FileMaker Skripten nicht nur für Experten …
FMK2012: Programmstrukturen - FileMaker Skripten nicht nur für Experten …FMK2012: Programmstrukturen - FileMaker Skripten nicht nur für Experten …
FMK2012: Programmstrukturen - FileMaker Skripten nicht nur für Experten …Verein FM Konferenz
 
Qualitätssicherung in ADF Projekten der IKB Deutschen Industriebank AG
Qualitätssicherung in ADF Projekten der IKB Deutschen Industriebank AGQualitätssicherung in ADF Projekten der IKB Deutschen Industriebank AG
Qualitätssicherung in ADF Projekten der IKB Deutschen Industriebank AGTorsten Kleiber
 
DWX 2014 - Coded UI in der Praxis: Von Lokalisierung bis Nachhaltigkeit
DWX 2014 -  Coded UI in der Praxis: Von Lokalisierung bis NachhaltigkeitDWX 2014 -  Coded UI in der Praxis: Von Lokalisierung bis Nachhaltigkeit
DWX 2014 - Coded UI in der Praxis: Von Lokalisierung bis NachhaltigkeitNico Orschel
 
Automatisiertes webauftritt testen
Automatisiertes webauftritt testenAutomatisiertes webauftritt testen
Automatisiertes webauftritt testenmradamlacey
 
Testing XAML-based Windows Store Apps mit VS 2013
Testing XAML-based Windows Store Apps mit VS 2013Testing XAML-based Windows Store Apps mit VS 2013
Testing XAML-based Windows Store Apps mit VS 2013Nico Orschel
 
Intersys - Integration mit Spirateam (Zurich 2017)
Intersys - Integration mit Spirateam (Zurich 2017)Intersys - Integration mit Spirateam (Zurich 2017)
Intersys - Integration mit Spirateam (Zurich 2017)Adam Sandman
 
Software-Engineering in der Luft- und Raumfahrt mit Open-Source-Tools
Software-Engineering in der Luft- und Raumfahrt mit Open-Source-ToolsSoftware-Engineering in der Luft- und Raumfahrt mit Open-Source-Tools
Software-Engineering in der Luft- und Raumfahrt mit Open-Source-ToolsAndreas Schreiber
 
Plsql drum test automatisiere, wer sich sich ewig bindet! - DOAG 2017
Plsql drum test automatisiere, wer sich sich ewig bindet! - DOAG 2017Plsql drum test automatisiere, wer sich sich ewig bindet! - DOAG 2017
Plsql drum test automatisiere, wer sich sich ewig bindet! - DOAG 2017Torsten Kleiber
 

Semelhante a Statische Analyse von Java-Code in der Praxis (20)

Vorgehensmodelle - Methoden der Wirtschaftsinformatik
Vorgehensmodelle - Methoden der WirtschaftsinformatikVorgehensmodelle - Methoden der Wirtschaftsinformatik
Vorgehensmodelle - Methoden der Wirtschaftsinformatik
 
Puppet - Module entwickeln - Von der Planung bis zur Umsetzung
Puppet - Module entwickeln - Von der Planung bis zur UmsetzungPuppet - Module entwickeln - Von der Planung bis zur Umsetzung
Puppet - Module entwickeln - Von der Planung bis zur Umsetzung
 
.NET und jetzt!
.NET und jetzt!.NET und jetzt!
.NET und jetzt!
 
Best Practices für TDD in JavaScript
Best Practices für TDD in JavaScriptBest Practices für TDD in JavaScript
Best Practices für TDD in JavaScript
 
Top 10 Internet Trends 2001
Top 10 Internet Trends 2001Top 10 Internet Trends 2001
Top 10 Internet Trends 2001
 
Tools zur Diagnose von Weblogic Performanceengpässen und Fehlerzuständen
Tools zur Diagnose von Weblogic Performanceengpässen und FehlerzuständenTools zur Diagnose von Weblogic Performanceengpässen und Fehlerzuständen
Tools zur Diagnose von Weblogic Performanceengpässen und Fehlerzuständen
 
Sdv 0405 design-pattern_thc_jps_skript
Sdv 0405 design-pattern_thc_jps_skriptSdv 0405 design-pattern_thc_jps_skript
Sdv 0405 design-pattern_thc_jps_skript
 
Sdv 0405 design-pattern_thc_jps_skript
Sdv 0405 design-pattern_thc_jps_skriptSdv 0405 design-pattern_thc_jps_skript
Sdv 0405 design-pattern_thc_jps_skript
 
FMK2012: Programmstrukturen - FileMaker Skripten nicht nur für Experten …
FMK2012: Programmstrukturen - FileMaker Skripten nicht nur für Experten …FMK2012: Programmstrukturen - FileMaker Skripten nicht nur für Experten …
FMK2012: Programmstrukturen - FileMaker Skripten nicht nur für Experten …
 
Qualitätssicherung in ADF Projekten der IKB Deutschen Industriebank AG
Qualitätssicherung in ADF Projekten der IKB Deutschen Industriebank AGQualitätssicherung in ADF Projekten der IKB Deutschen Industriebank AG
Qualitätssicherung in ADF Projekten der IKB Deutschen Industriebank AG
 
DWX 2014 - Coded UI in der Praxis: Von Lokalisierung bis Nachhaltigkeit
DWX 2014 -  Coded UI in der Praxis: Von Lokalisierung bis NachhaltigkeitDWX 2014 -  Coded UI in der Praxis: Von Lokalisierung bis Nachhaltigkeit
DWX 2014 - Coded UI in der Praxis: Von Lokalisierung bis Nachhaltigkeit
 
Automatisiertes webauftritt testen
Automatisiertes webauftritt testenAutomatisiertes webauftritt testen
Automatisiertes webauftritt testen
 
Testing XAML-based Windows Store Apps mit VS 2013
Testing XAML-based Windows Store Apps mit VS 2013Testing XAML-based Windows Store Apps mit VS 2013
Testing XAML-based Windows Store Apps mit VS 2013
 
ADF Software Factory
ADF Software FactoryADF Software Factory
ADF Software Factory
 
Systementwurf mit UML
Systementwurf mit UMLSystementwurf mit UML
Systementwurf mit UML
 
Intersys - Integration mit Spirateam (Zurich 2017)
Intersys - Integration mit Spirateam (Zurich 2017)Intersys - Integration mit Spirateam (Zurich 2017)
Intersys - Integration mit Spirateam (Zurich 2017)
 
Software-Engineering in der Luft- und Raumfahrt mit Open-Source-Tools
Software-Engineering in der Luft- und Raumfahrt mit Open-Source-ToolsSoftware-Engineering in der Luft- und Raumfahrt mit Open-Source-Tools
Software-Engineering in der Luft- und Raumfahrt mit Open-Source-Tools
 
Plsql drum test automatisiere, wer sich sich ewig bindet! - DOAG 2017
Plsql drum test automatisiere, wer sich sich ewig bindet! - DOAG 2017Plsql drum test automatisiere, wer sich sich ewig bindet! - DOAG 2017
Plsql drum test automatisiere, wer sich sich ewig bindet! - DOAG 2017
 
Enterprise JS
Enterprise JS Enterprise JS
Enterprise JS
 
Composite Simulation Roadmap
Composite Simulation RoadmapComposite Simulation Roadmap
Composite Simulation Roadmap
 

Statische Analyse von Java-Code in der Praxis

  • 1. 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
  • 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 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
  • 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 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
  • 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: 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
  • 11. 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
  • 12. (Open Source, kommerzielle Zusatzkomponenten) http://www.sonarsource.com 31. 5. 2012 c 2012 UNIVERSITÄT ROSTOCK | LEHRSTUHL FÜR MODELLIERUNG & SIMULATION (PROF. UHRMACHER) 12
  • 13. 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
  • 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 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
  • 19. 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
  • 20. 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
  • 21. 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
  • 22. 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
  • 23. 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
  • 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 II weiterentwickeln und Erfahrung sammeln mit... 31. 5. 2012 c 2012 UNIVERSITÄT ROSTOCK | LEHRSTUHL FÜR MODELLIERUNG & SIMULATION (PROF. UHRMACHER) 25
  • 26. 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
  • 27. Noch mehr Beispiele 31. 5. 2012 c 2012 UNIVERSITÄT ROSTOCK | LEHRSTUHL FÜR MODELLIERUNG & SIMULATION (PROF. UHRMACHER) 27
  • 28. 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
  • 29. 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
  • 30. 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
  • 31. 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