Your SlideShare is downloading. ×
Statische Analyse von Java-Code in der Praxis
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Statische Analyse von Java-Code in der Praxis

851

Published on

Vortrag für Informatik-Studenten der Universität Rostock, im Rahmen der Projektwoche (31. 5. 2012).

Vortrag für Informatik-Studenten der Universität Rostock, im Rahmen der Projektwoche (31. 5. 2012).

Published in: Education, Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
851
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
6
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Statische Analyse von Java-Code in der Praxis Vortragsreihe Tools in der Softwareentwicklung Roland Ewald31. 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 WerkzeugenBeispiele, Beispiele, Beispiele31. 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 Carmackhttp://www.altdevblogaday.com/2011/12/24/static-code-analysis31. 5. 2012 c 2012 UNIVERSITÄT ROSTOCK | LEHRSTUHL FÜR MODELLIERUNG & SIMULATION (PROF. UHRMACHER) 5
  • 6. http://en.wikipedia.org/wiki/John_D._Carmack31. 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, Metriken31. 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 Variablen31. 5. 2012 c 2012 UNIVERSITÄT ROSTOCK | LEHRSTUHL FÜR MODELLIERUNG & SIMULATION (PROF. UHRMACHER) 9
  • 10. Technical DebtPhoto: Andres Rueda / flickr.comE. Allman: Managing technical debt. Commun. ACM, vol. 55, no. 5, pp. 50-55, May 2012.http://dx.doi.org/10.1145/2160718.216073331. 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.com31. 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 Reviews31. 5. 2012 c 2012 UNIVERSITÄT ROSTOCK | LEHRSTUHL FÜR MODELLIERUNG & SIMULATION (PROF. UHRMACHER) 13
  • 14. http://nemo.sonarsource.org31. 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 einbindbar31. 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 }1415 //...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>(); 910 ReplicatedSimExecThread repThread = (ReplicatedSimExecThread) thread;1112 Vector<Integer> bestAlgorithms = new Vector<Integer>();1314 //...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 Paketen31. 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 undErfahrung 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 Beispiele31. 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

×