13.04.2013 Aufrufe

Statische Programmanalysen für die Qualitätssicherung - Informatik ...

Statische Programmanalysen für die Qualitätssicherung - Informatik ...

Statische Programmanalysen für die Qualitätssicherung - Informatik ...

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

<strong>Statische</strong> <strong>Programmanalysen</strong> <strong>für</strong> <strong>die</strong><br />

<strong>Qualitätssicherung</strong><br />

Prof. Dr. Rainer Koschke<br />

Arbeitsgruppe Softwaretechnik<br />

Fachbereich Mathematik und <strong>Informatik</strong><br />

Universität Bremen<br />

http://www.tzi.de/st<br />

7. Juli 2009


Wer wir sind<br />

Bereich<br />

Softwarequalität<br />

und -sicherheit<br />

Forschungskooperation<br />

Universität<br />

Bremen<br />

Universität<br />

Stuttgart<br />

Axivion<br />

GmbH<br />

Stopping Software Erosion<br />

<strong>Statische</strong><br />

<strong>Programmanalysen</strong><br />

<strong>für</strong><br />

<strong>die</strong> <strong>Qualitätssicherung</strong><br />

R. Koschke<br />

Software-<br />

Qualität<br />

<strong>Statische</strong><br />

Analyse<br />

Fehlersuche<br />

Code-Style<br />

Messung<br />

Bad Smells<br />

Architekturkonformität<br />

Ausblick<br />

Zusammenfass<br />

Literatur


Software-Qualität nach ISO/IEC-Standard 9126<br />

(2001)<br />

Änderbarkeit<br />

Übertragbarkeit<br />

Stabilität<br />

Zuverlässigkeit<br />

Prüfbarkeit<br />

Analysierbarkeit<br />

Reife<br />

Modifizierbarkeit<br />

Funktionalität<br />

Fehlertoleranz<br />

Wiederherstellbarkeit<br />

Ordnungsmäßigkeit<br />

Angemessenheit<br />

Interoperabilität<br />

Sicherheit<br />

Richtigkeit<br />

Softwarequalität<br />

Austauschbarkeit<br />

Installierbarkeit<br />

Konformität<br />

Verständlichkeit<br />

Erlernbarkeit<br />

Verbrauchsverhalten<br />

Zeitverhalten<br />

Anpassbarkeit<br />

Be<strong>die</strong>nbarkeit<br />

Benutzbarkeit<br />

Effizienz<br />

<strong>Statische</strong><br />

<strong>Programmanalysen</strong><br />

<strong>für</strong><br />

<strong>die</strong> <strong>Qualitätssicherung</strong><br />

R. Koschke<br />

Software-<br />

Qualität<br />

<strong>Statische</strong><br />

Analyse<br />

Fehlersuche<br />

Code-Style<br />

Messung<br />

Bad Smells<br />

Architekturkonformität<br />

Ausblick<br />

Zusammenfass<br />

Literatur


Software-Prüfung (Frühauf u. a., 2000)<br />

nicht−mechanisch<br />

(durch Menschen)<br />

Reviews<br />

Inspektionen<br />

Software−Prüfung<br />

mechanisch<br />

(durch den Rechner)<br />

statisch dynamisch<br />

Programm−<br />

analysen<br />

Tests<br />

<strong>Statische</strong><br />

<strong>Programmanalysen</strong><br />

<strong>für</strong><br />

<strong>die</strong> <strong>Qualitätssicherung</strong><br />

R. Koschke<br />

Software-<br />

Qualität<br />

<strong>Statische</strong><br />

Analyse<br />

Fehlersuche<br />

Code-Style<br />

Messung<br />

Bad Smells<br />

Architekturkonformität<br />

Ausblick<br />

Zusammenfass<br />

Literatur


<strong>Statische</strong> Programmanalyse<br />

<strong>Statische</strong> Programmanalyse<br />

= Analyse eines Programms anhand des Programmtexts, d.h.<br />

ohne Ausführung des Programms.<br />

Frühe Beispiele:<br />

Compiler<br />

Lint (1979):<br />

Aufspüren von gefährlichen Konstrukten, z.B.<br />

uninitialisierte Variablen,<br />

Überprüfung von einheitlichem Quelltext-Layout,<br />

Erkennen nicht portabler Konstrukte<br />

<strong>Statische</strong><br />

<strong>Programmanalysen</strong><br />

<strong>für</strong><br />

<strong>die</strong> <strong>Qualitätssicherung</strong><br />

R. Koschke<br />

Software-<br />

Qualität<br />

<strong>Statische</strong><br />

Analyse<br />

Ziele<br />

Vorgehen<br />

Probleme<br />

Statisch vs.<br />

dynamisch<br />

Fehlersuche<br />

Code-Style<br />

Messung<br />

Bad Smells<br />

Architekturkonformität<br />

Ausblick


Ziele<br />

Fehlersuche/Sicherheitsprobleme<br />

Co<strong>die</strong>rrichtlinienprüfung<br />

Messung innerer Qualität<br />

Auffinden von Bad-Smells<br />

statische Architekturkonformität<br />

<strong>Statische</strong><br />

<strong>Programmanalysen</strong><br />

<strong>für</strong><br />

<strong>die</strong> <strong>Qualitätssicherung</strong><br />

R. Koschke<br />

Software-<br />

Qualität<br />

<strong>Statische</strong><br />

Analyse<br />

Ziele<br />

Vorgehen<br />

Probleme<br />

Statisch vs.<br />

dynamisch<br />

Fehlersuche<br />

Code-Style<br />

Messung<br />

Bad Smells<br />

Architekturkonformität<br />

Ausblick


Fehlersuche<br />

1 v o i d count ( i n t ∗ t , i n t ∗a ) {<br />

2 FILE ∗ f ;<br />

3 c h a r c ;<br />

4 f = fopen ( " f i l e . t x t " , " r " ) ;<br />

5 i f ( f != NULL) {<br />

6 ∗ t = 0 ; ∗a = 0 ;<br />

7 c = f g e t c ( f ) ;<br />

8 w h i l e ( c != EOF) {<br />

9 i f ( c == ’ a ’ ) ∗a = ∗a + 1 ;<br />

10 ∗ t = ∗ t + 1 ;<br />

11 c = f g e t c ( f ) ;<br />

12 }<br />

13 c l o s e ( f ) ;<br />

14 }<br />

15 }<br />

16 i n t main ( ) {<br />

17 i n t t , a ;<br />

18 count (&t , &a ) ;<br />

19 p r i n t f ( "%f \n" , ( f l o a t ) a /( f l o a t ) t ) ;<br />

20 }<br />

<strong>Statische</strong><br />

<strong>Programmanalysen</strong><br />

<strong>für</strong><br />

<strong>die</strong> <strong>Qualitätssicherung</strong><br />

R. Koschke<br />

Software-<br />

Qualität<br />

<strong>Statische</strong><br />

Analyse<br />

Ziele<br />

Vorgehen<br />

Probleme<br />

Statisch vs.<br />

dynamisch<br />

Fehlersuche<br />

Code-Style<br />

Messung<br />

Bad Smells<br />

Architekturkonformität<br />

Ausblick


Schritte der statischen Analyse<br />

Programmtext<br />

mit<br />

Makros<br />

Parser<br />

Zwischensprachengenerator<br />

Präprozessor<br />

abstrakter<br />

Syntaxbaum<br />

Zwischendarstellung<br />

semantische<br />

Analyse<br />

Programmtext<br />

Lexer<br />

annotierter<br />

abstrakter<br />

Syntaxbaum<br />

Analysen Ausgabe<br />

Tokenstrom<br />

Front-End<br />

<strong>Statische</strong><br />

<strong>Programmanalysen</strong><br />

<strong>für</strong><br />

<strong>die</strong> <strong>Qualitätssicherung</strong><br />

R. Koschke<br />

Software-<br />

Qualität<br />

<strong>Statische</strong><br />

Analyse<br />

Ziele<br />

Vorgehen<br />

Probleme<br />

Statisch vs.<br />

dynamisch<br />

Fehlersuche<br />

Code-Style<br />

Messung<br />

Bad Smells<br />

Architekturkonformität<br />

Ausblick


Typisches Vorgehen bei statischer Analyse<br />

Abstrakte statische Ausführung:<br />

1 Repräsentation des Programms (meist als<br />

Kontrollflussgraph (KFG))<br />

2 Modell des Programmzustands<br />

3 Transferfunktion <strong>für</strong> jedes Programmkonstrukt<br />

4 Inferenz beginnend mit Initialzustand über <strong>die</strong><br />

Programmrepräsentation<br />

<strong>Statische</strong><br />

<strong>Programmanalysen</strong><br />

<strong>für</strong><br />

<strong>die</strong> <strong>Qualitätssicherung</strong><br />

R. Koschke<br />

Software-<br />

Qualität<br />

<strong>Statische</strong><br />

Analyse<br />

Ziele<br />

Vorgehen<br />

Probleme<br />

Statisch vs.<br />

dynamisch<br />

Fehlersuche<br />

Code-Style<br />

Messung<br />

Bad Smells<br />

Architekturkonformität<br />

Ausblick


Repräsentation des Programms<br />

1 v o i d count ( i n t ∗ t , i n t ∗a ) {<br />

2 FILE ∗ f ;<br />

3 c h a r c ;<br />

4 f = fopen ( " f i l e . t x t " , " r " ) ;<br />

5 i f ( f != NULL) {<br />

6 ∗ t = 0 ; ∗a = 0 ;<br />

7 c = f g e t c ( f ) ;<br />

8 w h i l e ( c != EOF) {<br />

9 i f ( c == ’ a ’ )<br />

10 ∗a = ∗a + 1 ;<br />

11 ∗ t = ∗ t + 1 ;<br />

12 c = f g e t c ( f ) ;<br />

13 }<br />

14 c l o s e ( f ) ;<br />

15 }<br />

16 }<br />

(a) Code<br />

false<br />

f = fopen("file.txt","r")<br />

false<br />

entry count<br />

f != NULL<br />

*t = 0<br />

*a = 0<br />

c = fgetc (f)<br />

c != EOF<br />

true<br />

c == ’a’<br />

true<br />

*a = *a + 1<br />

false<br />

*t = *t + 1<br />

c = fgetc (f)<br />

exit<br />

true<br />

close (f)<br />

(b) KFG<br />

<strong>Statische</strong><br />

<strong>Programmanalysen</strong><br />

<strong>für</strong><br />

<strong>die</strong> <strong>Qualitätssicherung</strong><br />

R. Koschke<br />

Software-<br />

Qualität<br />

<strong>Statische</strong><br />

Analyse<br />

Ziele<br />

Vorgehen<br />

Probleme<br />

Statisch vs.<br />

dynamisch<br />

Fehlersuche<br />

Code-Style<br />

Messung<br />

Bad Smells<br />

Architekturkonformität<br />

Ausblick


Modell des Programms<br />

Modellzustand 1: Variable ist<br />

sicher uninitialisiert<br />

vielleicht uninitialisiert<br />

sicher initialisiert<br />

Modellzustand 2: Variable ist<br />

vielleicht = 0<br />

sicher = 0<br />

false<br />

f = fopen("file.txt","r")<br />

false<br />

entry count<br />

f != NULL<br />

*t = 0<br />

*a = 0<br />

c = fgetc (f)<br />

c != EOF<br />

true<br />

c == ’a’<br />

true<br />

*a = *a + 1<br />

false<br />

*t = *t + 1<br />

c = fgetc (f)<br />

exit<br />

true<br />

close (f)<br />

<strong>Statische</strong><br />

<strong>Programmanalysen</strong><br />

<strong>für</strong><br />

<strong>die</strong> <strong>Qualitätssicherung</strong><br />

R. Koschke<br />

Software-<br />

Qualität<br />

<strong>Statische</strong><br />

Analyse<br />

Ziele<br />

Vorgehen<br />

Probleme<br />

Statisch vs.<br />

dynamisch<br />

Fehlersuche<br />

Code-Style<br />

Messung<br />

Bad Smells<br />

Architekturkonformität<br />

Ausblick


Transferfunktion und Inferenz<br />

Modellzustand 1: Konstrukte . . .<br />

Deklaration → sicher<br />

uninitialisiert<br />

Zuweisung → sicher initialisiert<br />

Beginn eines Blocks:<br />

Variable initialisiert <strong>für</strong> alle<br />

Vorgänger → initialisiert<br />

Variable sicher uninitialisiert<br />

<strong>für</strong> alle Vorgänger → sicher<br />

uninitialisiert<br />

sonst → vielleicht uninitialisiert<br />

false<br />

f = fopen("file.txt","r")<br />

false<br />

entry count<br />

f != NULL<br />

*t = 0<br />

*a = 0<br />

c = fgetc (f)<br />

c != EOF<br />

true<br />

c == ’a’<br />

true<br />

*a = *a + 1<br />

false<br />

*t = *t + 1<br />

c = fgetc (f)<br />

exit<br />

true<br />

close (f)<br />

<strong>Statische</strong><br />

<strong>Programmanalysen</strong><br />

<strong>für</strong><br />

<strong>die</strong> <strong>Qualitätssicherung</strong><br />

R. Koschke<br />

Software-<br />

Qualität<br />

<strong>Statische</strong><br />

Analyse<br />

Ziele<br />

Vorgehen<br />

Probleme<br />

Statisch vs.<br />

dynamisch<br />

Fehlersuche<br />

Code-Style<br />

Messung<br />

Bad Smells<br />

Architekturkonformität<br />

Ausblick


<strong>Statische</strong> Werkzeuge zur Fehlersuche<br />

Open-Source:<br />

FindBugs<br />

PMD<br />

Splint (LCLint)<br />

Kommerziell:<br />

Polyspace<br />

Coverity<br />

Klocwork<br />

PC-Lint<br />

<strong>Statische</strong><br />

<strong>Programmanalysen</strong><br />

<strong>für</strong><br />

<strong>die</strong> <strong>Qualitätssicherung</strong><br />

R. Koschke<br />

Software-<br />

Qualität<br />

<strong>Statische</strong><br />

Analyse<br />

Ziele<br />

Vorgehen<br />

Probleme<br />

Statisch vs.<br />

dynamisch<br />

Fehlersuche<br />

Code-Style<br />

Messung<br />

Bad Smells<br />

Architekturkonformität<br />

Ausblick


Probleme statischer Analysen<br />

Aliasing<br />

Polymorphismus und dynamisches Binden<br />

Reflection<br />

Parallelität<br />

verteilte Systeme<br />

Laufzeitinstanzen versus statischer Einheiten (z.B. Klassen)<br />

→ viele Entscheidungen erst zur Laufzeit<br />

→ statische Analyse problematisch<br />

<strong>Statische</strong><br />

<strong>Programmanalysen</strong><br />

<strong>für</strong><br />

<strong>die</strong> <strong>Qualitätssicherung</strong><br />

R. Koschke<br />

Software-<br />

Qualität<br />

<strong>Statische</strong><br />

Analyse<br />

Ziele<br />

Vorgehen<br />

Probleme<br />

Statisch vs.<br />

dynamisch<br />

Fehlersuche<br />

Code-Style<br />

Messung<br />

Bad Smells<br />

Architekturkonformität<br />

Ausblick


Statisch vs. Dynamisch<br />

dynamisch: zu konkret,<br />

nicht verallgemeinerbar<br />

→ Teilmenge<br />

statisch: zu abstrakt, daher<br />

ungenau<br />

→ Obermenge<br />

Wahrheit liegt (meist)<br />

dazwischen<br />

statisch<br />

dynamisch<br />

wirklich<br />

y = f(x);<br />

if (y < 0)<br />

y = -y;<br />

Dynamisch: y ∈ {0, 2, 7, 79}<br />

Statisch: 0 ≤ y ≤ MAX_INT<br />

Wirklich: 0 ≤ y ≤ 100<br />

<strong>Statische</strong><br />

<strong>Programmanalysen</strong><br />

<strong>für</strong><br />

<strong>die</strong> <strong>Qualitätssicherung</strong><br />

R. Koschke<br />

Software-<br />

Qualität<br />

<strong>Statische</strong><br />

Analyse<br />

Ziele<br />

Vorgehen<br />

Probleme<br />

Statisch vs.<br />

dynamisch<br />

Fehlersuche<br />

Code-Style<br />

Messung<br />

Bad Smells<br />

Architekturkonformität<br />

Ausblick


Analysedreieck<br />

Präzision<br />

Kosten (CPU, RAM)<br />

0<br />

Vollständigkeit<br />

<strong>Statische</strong><br />

<strong>Programmanalysen</strong><br />

<strong>für</strong><br />

<strong>die</strong> <strong>Qualitätssicherung</strong><br />

R. Koschke<br />

Software-<br />

Qualität<br />

<strong>Statische</strong><br />

Analyse<br />

Ziele<br />

Vorgehen<br />

Probleme<br />

Statisch vs.<br />

dynamisch<br />

Fehlersuche<br />

Code-Style<br />

Messung<br />

Bad Smells<br />

Architekturkonformität<br />

Ausblick


<strong>Statische</strong> Analyse zur Fehlersuche<br />

Suche nach wiederkehrenden Programmierfehlern und<br />

Sicherheitsproblemen, z.B.<br />

Null-Zeiger-Dereferenzierung<br />

uninitialisierte Variable<br />

Zeiger auf freigegebene Objekte<br />

Division durch Null<br />

Out-of-Range-Zugriffe<br />

Buffer-Overflow<br />

. . .<br />

→ findet keine Abweichungen von der Spezifikation<br />

→ statische Prüfung kann Tests nicht ersetzen, nur ergänzen<br />

<strong>Statische</strong><br />

<strong>Programmanalysen</strong><br />

<strong>für</strong><br />

<strong>die</strong> <strong>Qualitätssicherung</strong><br />

R. Koschke<br />

Software-<br />

Qualität<br />

<strong>Statische</strong><br />

Analyse<br />

Fehlersuche<br />

Code-Style<br />

Messung<br />

Bad Smells<br />

Architekturkonformität<br />

Ausblick<br />

Zusammenfass<br />

Literatur


Code-Richtlinienprüfung<br />

1 i f ( b = 2)<br />

2 x [ i ] = i ++;<br />

3 a = 2 ;<br />

Allgemeine Standards, z.B. MISRA-C 1 , MISRA-C++<br />

Best Practices zur Vermeidung fehlerträchtiger<br />

Programmierkonstrukte<br />

mehr als 100 Regeln<br />

nicht alle sind prüfbar (z.B. sinnvolle Kommentierung)<br />

Organisationsspezifische Richtlinien, z.B<br />

richtige Verwendung von APIs<br />

organisationseinheitliches Layout<br />

1 Motor Industry Software Reliability Association (MISRA)<br />

<strong>Statische</strong><br />

<strong>Programmanalysen</strong><br />

<strong>für</strong><br />

<strong>die</strong> <strong>Qualitätssicherung</strong><br />

R. Koschke<br />

Software-<br />

Qualität<br />

<strong>Statische</strong><br />

Analyse<br />

Fehlersuche<br />

Code-Style<br />

Messung<br />

Bad Smells<br />

Architekturkonformität<br />

Ausblick<br />

Zusammenfass<br />

Literatur


Werkzeuge zur Prüfung von Code-Richtlinien<br />

Open-Source<br />

Checkstyle<br />

oft auch eingebaut in den Compiler<br />

Kommerzielle:<br />

Axivion Bauhaus Suite<br />

Parasoft<br />

SemanticDesigns<br />

QA/C<br />

<strong>Statische</strong><br />

<strong>Programmanalysen</strong><br />

<strong>für</strong><br />

<strong>die</strong> <strong>Qualitätssicherung</strong><br />

R. Koschke<br />

Software-<br />

Qualität<br />

<strong>Statische</strong><br />

Analyse<br />

Fehlersuche<br />

Code-Style<br />

Messung<br />

Bad Smells<br />

Architekturkonformität<br />

Ausblick<br />

Zusammenfass<br />

Literatur


Software-Cockpit (Dashboard)<br />

Process.Changes<br />

Performance.Time<br />

Test.Coverage<br />

Resources.Developers<br />

Code.Comments<br />

Code.Complexity<br />

<strong>Statische</strong><br />

<strong>Programmanalysen</strong><br />

<strong>für</strong><br />

<strong>die</strong> <strong>Qualitätssicherung</strong><br />

R. Koschke<br />

Software-<br />

Qualität<br />

<strong>Statische</strong><br />

Analyse<br />

Fehlersuche<br />

Code-Style<br />

Messung<br />

Cockpit<br />

Vorhersagemetriken<br />

Trends<br />

Bad Smells<br />

Architekturkonformität<br />

Ausblick<br />

Zusammenfass


Ziel: Ökonomische <strong>Qualitätssicherung</strong><br />

Ziel: Fehler so früh wie möglich<br />

finden<br />

Code-Reviews<br />

Tests<br />

Ökonomieprinzip: Fokussierung der<br />

Maßnahmen<br />

→ Verwendung eines<br />

Vorhersagemodells<br />

<strong>Statische</strong><br />

<strong>Programmanalysen</strong><br />

<strong>für</strong><br />

<strong>die</strong> <strong>Qualitätssicherung</strong><br />

R. Koschke<br />

Software-<br />

Qualität<br />

<strong>Statische</strong><br />

Analyse<br />

Fehlersuche<br />

Code-Style<br />

Messung<br />

Cockpit<br />

Vorhersagemetriken<br />

Trends<br />

Bad Smells<br />

Architekturkonformität<br />

Ausblick<br />

Zusammenfass


Code-Metriken<br />

Klassische prozedurale Metriken:<br />

Lines-of-Code (LOC)<br />

McCabe Complexity (Anzahl der Bedingungen)<br />

Halstead-Volumen (N × log(n) mit N = Gesamtzahl<br />

Tokens und n = Anzahl verschiedener Tokens)<br />

. . .<br />

Objektorientierte Metriken:<br />

Tiefe der Vererbungsbaums<br />

Anzahl von Methoden und Attribute<br />

Anzahl redefinierter Methoden<br />

. . .<br />

Änderungsmetriken:<br />

Churn (Anzahl geänderter, hinzugefügter oder gelöschter<br />

Zeilen)<br />

<strong>Statische</strong><br />

<strong>Programmanalysen</strong><br />

<strong>für</strong><br />

<strong>die</strong> <strong>Qualitätssicherung</strong><br />

R. Koschke<br />

Software-<br />

Qualität<br />

<strong>Statische</strong><br />

Analyse<br />

Fehlersuche<br />

Code-Style<br />

Messung<br />

Cockpit<br />

Vorhersagemetriken<br />

Trends<br />

Bad Smells<br />

Architekturkonformität<br />

Ausblick<br />

Zusammenfass


Metriken zur Vorhersage fehlerhafter Module<br />

Defects<br />

0.0 0.2 0.4 0.6 0.8 1.0<br />

0.0 0.2 0.4 0.6 0.8 1.0<br />

Lines of Code<br />

Optimal<br />

rpart<br />

Random Forest<br />

Bagging<br />

– Mende und Koschke (2009); Mende u. a. (2009)<br />

<strong>Statische</strong><br />

<strong>Programmanalysen</strong><br />

<strong>für</strong><br />

<strong>die</strong> <strong>Qualitätssicherung</strong><br />

R. Koschke<br />

Software-<br />

Qualität<br />

<strong>Statische</strong><br />

Analyse<br />

Fehlersuche<br />

Code-Style<br />

Messung<br />

Cockpit<br />

Vorhersagemetriken<br />

Trends<br />

Bad Smells<br />

Architekturkonformität<br />

Ausblick<br />

Zusammenfass


Trend-Analyse: Modularisierung<br />

<strong>Statische</strong><br />

<strong>Programmanalysen</strong><br />

<strong>für</strong><br />

<strong>die</strong> <strong>Qualitätssicherung</strong><br />

R. Koschke<br />

Software-<br />

Qualität<br />

<strong>Statische</strong><br />

Analyse<br />

Fehlersuche<br />

Code-Style<br />

Messung<br />

Cockpit<br />

Vorhersagemetriken<br />

Trends<br />

Bad Smells<br />

Architekturkonformität<br />

Ausblick<br />

Zusammenfass


Trend-Analyse: Kommentierung<br />

<strong>Statische</strong><br />

<strong>Programmanalysen</strong><br />

<strong>für</strong><br />

<strong>die</strong> <strong>Qualitätssicherung</strong><br />

R. Koschke<br />

Software-<br />

Qualität<br />

<strong>Statische</strong><br />

Analyse<br />

Fehlersuche<br />

Code-Style<br />

Messung<br />

Cockpit<br />

Vorhersagemetriken<br />

Trends<br />

Bad Smells<br />

Architekturkonformität<br />

Ausblick<br />

Zusammenfass


Stink Parade of Bad Smells by Fowler (2000)<br />

duplizierter Code<br />

lange Funktionen oder Methoden<br />

große Module oder Klassen<br />

lange Parameterlisten<br />

divergente Änderung<br />

eine Klasse/ein Modul wird stets geändert in verschiedener<br />

Weise und <strong>für</strong> unterschiedliche Gründe<br />

Schrotflinten-Chirurgie (Shotgun Surgery)<br />

kleine Änderungen überall<br />

Feature-Neid<br />

ein Modul/eine Klasse benutzt sehr viele<br />

Variablen/Attribute einer anderen Klasse bzw. eines<br />

anderen Moduls<br />

. . .<br />

<strong>Statische</strong><br />

<strong>Programmanalysen</strong><br />

<strong>für</strong><br />

<strong>die</strong> <strong>Qualitätssicherung</strong><br />

R. Koschke<br />

Software-<br />

Qualität<br />

<strong>Statische</strong><br />

Analyse<br />

Fehlersuche<br />

Code-Style<br />

Messung<br />

Bad Smells<br />

Klone<br />

Code Quality<br />

Architekturkonformität<br />

Ausblick<br />

Zusammenfass<br />

Literatur


Duplizierter Code<br />

<strong>Statische</strong><br />

<strong>Programmanalysen</strong><br />

<strong>für</strong><br />

<strong>die</strong> <strong>Qualitätssicherung</strong><br />

R. Koschke<br />

Software-<br />

Qualität<br />

<strong>Statische</strong><br />

Analyse<br />

Fehlersuche<br />

Code-Style<br />

Messung<br />

Bad Smells<br />

Klone<br />

Code Quality<br />

Architekturkonformität<br />

Ausblick<br />

Zusammenfass<br />

Literatur


Stu<strong>die</strong>n zu Auswirkungen von Klonen<br />

Monden u. a. (2002):<br />

2,000 Cobol-Module mit Klonen mit mindestens der Länge<br />

30 Zeilen (1 MLOC, 20 Jahre alt)<br />

Korrelation von max. Klonlänge und Fehlerrate<br />

→ höchste Fehlerdichte in Modulen mit mind. 200-Zeilen<br />

langem Klon<br />

<strong>Statische</strong><br />

<strong>Programmanalysen</strong><br />

<strong>für</strong><br />

<strong>die</strong> <strong>Qualitätssicherung</strong><br />

R. Koschke<br />

Software-<br />

Qualität<br />

<strong>Statische</strong><br />

Analyse<br />

Fehlersuche<br />

Code-Style<br />

Messung<br />

Bad Smells<br />

Klone<br />

Code Quality<br />

Architekturkonformität<br />

Ausblick<br />

Zusammenfass<br />

Literatur


Stu<strong>die</strong>n zu Auswirkungen von Klonen<br />

Hypothese (Chou u. a., 2001)<br />

Wenn eine Funktion/Datei/Verzeichnis einen Fehler hat, dann<br />

ist es wahrscheinlicher, dass sie noch weitere Fehler hat.<br />

Beobachtungen in ihrer Stu<strong>die</strong> <strong>für</strong> Linux und OpenBSD:<br />

Hypothese gilt insbesondere, wenn <strong>die</strong> sich Ignoranz von<br />

API-Regeln mit Copy&Paste paart<br />

→ Programmierer glauben, dass operationaler Code korrekter<br />

Code ist<br />

→ Code kann fehlerhaft sein oder in einen Kontext kopiert<br />

werden, <strong>für</strong> den er nicht gedacht war<br />

<strong>Statische</strong><br />

<strong>Programmanalysen</strong><br />

<strong>für</strong><br />

<strong>die</strong> <strong>Qualitätssicherung</strong><br />

R. Koschke<br />

Software-<br />

Qualität<br />

<strong>Statische</strong><br />

Analyse<br />

Fehlersuche<br />

Code-Style<br />

Messung<br />

Bad Smells<br />

Klone<br />

Code Quality<br />

Architekturkonformität<br />

Ausblick<br />

Zusammenfass<br />

Literatur


Stu<strong>die</strong>n zu Auswirkungen von Klonen<br />

Li u. a. (2006) <strong>für</strong> Linux-Kernel, FreeBSD, Apache, PostgreSQL:<br />

Fehler wegen Klonen, deren Bezeichner inkonsistent umbenannt<br />

wurden<br />

<strong>Statische</strong><br />

<strong>Programmanalysen</strong><br />

<strong>für</strong><br />

<strong>die</strong> <strong>Qualitätssicherung</strong><br />

R. Koschke<br />

Software-<br />

Qualität<br />

<strong>Statische</strong><br />

Analyse<br />

Fehlersuche<br />

Code-Style<br />

Messung<br />

Bad Smells<br />

Klone<br />

Code Quality<br />

Architekturkonformität<br />

Ausblick<br />

Zusammenfass<br />

Literatur


Stu<strong>die</strong>n zu Auswirkungen von Klonen<br />

Fehler durch inkonsistent geänderte Klone (Juergens u. a.,<br />

2009)<br />

52 % aller Klone wurden inkonsistent geändert<br />

28 % aller inkonsistenter Klone waren ungewollt<br />

inkonsistent geändert<br />

15 % aller inkonsistenter Klone sind Fehler<br />

<strong>Statische</strong><br />

<strong>Programmanalysen</strong><br />

<strong>für</strong><br />

<strong>die</strong> <strong>Qualitätssicherung</strong><br />

R. Koschke<br />

Software-<br />

Qualität<br />

<strong>Statische</strong><br />

Analyse<br />

Fehlersuche<br />

Code-Style<br />

Messung<br />

Bad Smells<br />

Klone<br />

Code Quality<br />

Architekturkonformität<br />

Ausblick<br />

Zusammenfass<br />

Literatur


Wie können Klone gefunden werden?<br />

Granularität<br />

Klassen,<br />

Dateien<br />

Funktionen<br />

Anweisungen<br />

Vergleich von . . .<br />

Text<br />

Bezeichnern<br />

Token<br />

Syntaxbäume<br />

Kontroll- und<br />

Datenabhängigkeiten<br />

Verwendete<br />

Techniken:<br />

textuelles Diff<br />

Dotplot<br />

Data Mining<br />

Suffix-Bäume<br />

Baumvergleich<br />

Graphvergleich<br />

Information<br />

Retrieval<br />

Metrikenvergleich<br />

Hashing<br />

<strong>Statische</strong><br />

<strong>Programmanalysen</strong><br />

<strong>für</strong><br />

<strong>die</strong> <strong>Qualitätssicherung</strong><br />

R. Koschke<br />

Software-<br />

Qualität<br />

<strong>Statische</strong><br />

Analyse<br />

Fehlersuche<br />

Code-Style<br />

Messung<br />

Bad Smells<br />

Klone<br />

Code Quality<br />

Architekturkonformität<br />

Ausblick<br />

Zusammenfass<br />

Literatur


Code Quality Index (Simon u. a., 2006)<br />

Aufwand<br />

Bauchgefühl<br />

Code−Quality−<br />

Index<br />

manuelles<br />

Review<br />

Objektivität, Genauigkeit<br />

Quality-Benchmark-Level auf Basis eines statisch ermittelten,<br />

objektiven Code-Quality-Index:<br />

52 Qualitätsindikatoren (Typen von Bad Smells)<br />

Häufigkeitsverteilung <strong>für</strong> mehr als 120 industrielle Systeme<br />

geschrieben in C++ und Java → „Industriestandard“<br />

<strong>Statische</strong><br />

<strong>Programmanalysen</strong><br />

<strong>für</strong><br />

<strong>die</strong> <strong>Qualitätssicherung</strong><br />

R. Koschke<br />

Software-<br />

Qualität<br />

<strong>Statische</strong><br />

Analyse<br />

Fehlersuche<br />

Code-Style<br />

Messung<br />

Bad Smells<br />

Klone<br />

Code Quality<br />

Architekturkonformität<br />

Ausblick<br />

Zusammenfass<br />

Literatur


Software-Architektur in der Theorie<br />

Compiler-Architektur nach Shaw und Garlan (1993)<br />

Symbol<br />

Table<br />

Text<br />

Lexical Syntactic Semantic<br />

Code Code<br />

Optimization<br />

Analysis Analysis Analysis<br />

Generation<br />

AST<br />

<strong>Statische</strong><br />

<strong>Programmanalysen</strong><br />

<strong>für</strong><br />

<strong>die</strong> <strong>Qualitätssicherung</strong><br />

R. Koschke<br />

Software-<br />

Qualität<br />

<strong>Statische</strong><br />

Analyse<br />

Fehlersuche<br />

Code-Style<br />

Messung<br />

Bad Smells<br />

Architekturkonformität<br />

Ideal<br />

Wirklichkeit<br />

Prüfung<br />

Ausblick<br />

Zusammenfass


Softwarearchitektur in der Praxis<br />

Compiler-Architektur im wirklichen Leben<br />

<strong>Statische</strong><br />

<strong>Programmanalysen</strong><br />

<strong>für</strong><br />

<strong>die</strong> <strong>Qualitätssicherung</strong><br />

R. Koschke<br />

Software-<br />

Qualität<br />

<strong>Statische</strong><br />

Analyse<br />

Fehlersuche<br />

Code-Style<br />

Messung<br />

Bad Smells<br />

Architekturkonformität<br />

Ideal<br />

Wirklichkeit<br />

Prüfung<br />

Ausblick<br />

Zusammenfass


Abhängigkeiten<br />

Graph der direkten Aufrufe<br />

<strong>Statische</strong><br />

<strong>Programmanalysen</strong><br />

<strong>für</strong><br />

<strong>die</strong> <strong>Qualitätssicherung</strong><br />

R. Koschke<br />

Software-<br />

Qualität<br />

<strong>Statische</strong><br />

Analyse<br />

Fehlersuche<br />

Code-Style<br />

Messung<br />

Bad Smells<br />

Architekturkonformität<br />

Ideal<br />

Wirklichkeit<br />

Prüfung<br />

Ausblick<br />

Zusammenfass


Abhängigkeiten<br />

Graph der direkten und indirekten Aufrufe<br />

<strong>Statische</strong><br />

<strong>Programmanalysen</strong><br />

<strong>für</strong><br />

<strong>die</strong> <strong>Qualitätssicherung</strong><br />

R. Koschke<br />

Software-<br />

Qualität<br />

<strong>Statische</strong><br />

Analyse<br />

Fehlersuche<br />

Code-Style<br />

Messung<br />

Bad Smells<br />

Architekturkonformität<br />

Ideal<br />

Wirklichkeit<br />

Prüfung<br />

Ausblick<br />

Zusammenfass


Abhängigkeiten<br />

Alle Aufrufe und Software-Klone<br />

<strong>Statische</strong><br />

<strong>Programmanalysen</strong><br />

<strong>für</strong><br />

<strong>die</strong> <strong>Qualitätssicherung</strong><br />

R. Koschke<br />

Software-<br />

Qualität<br />

<strong>Statische</strong><br />

Analyse<br />

Fehlersuche<br />

Code-Style<br />

Messung<br />

Bad Smells<br />

Architekturkonformität<br />

Ideal<br />

Wirklichkeit<br />

Prüfung<br />

Ausblick<br />

Zusammenfass


Abhängigkeiten<br />

Nur Klone<br />

<strong>Statische</strong><br />

<strong>Programmanalysen</strong><br />

<strong>für</strong><br />

<strong>die</strong> <strong>Qualitätssicherung</strong><br />

R. Koschke<br />

Software-<br />

Qualität<br />

<strong>Statische</strong><br />

Analyse<br />

Fehlersuche<br />

Code-Style<br />

Messung<br />

Bad Smells<br />

Architekturkonformität<br />

Ideal<br />

Wirklichkeit<br />

Prüfung<br />

Ausblick<br />

Zusammenfass


Software-Architektur in Theorie und Praxis<br />

Symbol<br />

Table<br />

Text<br />

Lexical Syntactic Semantic<br />

Code Code<br />

Optimization<br />

Analysis Analysis Analysis<br />

Generation<br />

AST<br />

<strong>Statische</strong><br />

<strong>Programmanalysen</strong><br />

<strong>für</strong><br />

<strong>die</strong> <strong>Qualitätssicherung</strong><br />

R. Koschke<br />

Software-<br />

Qualität<br />

<strong>Statische</strong><br />

Analyse<br />

Fehlersuche<br />

Code-Style<br />

Messung<br />

Bad Smells<br />

Architekturkonformität<br />

Ideal<br />

Wirklichkeit<br />

Prüfung<br />

Ausblick<br />

Zusammenfass


Reflexionsmethode (Murphy u. a., 1995)<br />

1 Stelle Architekturmodell auf<br />

2 Extrahiere Implementierungsmodell<br />

3 Bilde Modelle aufeinander ab<br />

4 Berechne Reflexionsmodell<br />

5 Verfeinere/korrigiere<br />

Beispiel<br />

H1<br />

H2<br />

H3<br />

<strong>Statische</strong><br />

<strong>Programmanalysen</strong><br />

<strong>für</strong><br />

<strong>die</strong> <strong>Qualitätssicherung</strong><br />

R. Koschke<br />

Software-<br />

Qualität<br />

<strong>Statische</strong><br />

Analyse<br />

Fehlersuche<br />

Code-Style<br />

Messung<br />

Bad Smells<br />

Architekturkonformität<br />

Ideal<br />

Wirklichkeit<br />

Prüfung<br />

Ausblick<br />

Zusammenfass


Axivion Bauhaus-Werkzeug zur Architekturprüfung<br />

<strong>Statische</strong><br />

<strong>Programmanalysen</strong><br />

<strong>für</strong><br />

<strong>die</strong> <strong>Qualitätssicherung</strong><br />

R. Koschke<br />

Software-<br />

Qualität<br />

<strong>Statische</strong><br />

Analyse<br />

Fehlersuche<br />

Code-Style<br />

Messung<br />

Bad Smells<br />

Architekturkonformität<br />

Ideal<br />

Wirklichkeit<br />

Prüfung<br />

Ausblick<br />

Zusammenfass


Die Rolle von Modellen in der Entwicklung<br />

heutige Verwendung von Modellen:<br />

deskriptiv: <strong>die</strong>nen der Dokumentation des Codes<br />

präskriptiv: <strong>die</strong>nen der Prüfung des Codes (z.B.<br />

Reflexionsanalyse)<br />

Trend: Modelle sind der Code<br />

modellgetriebene Entwicklung mit automatischer<br />

Code-Generierung<br />

Koschkesche Vermutung:<br />

Auch Modelle werden das Qualitätsproblem von Software nicht<br />

lösen. Wir werden weiterhin Test und statische Analyse<br />

benötigen.<br />

<strong>Statische</strong><br />

<strong>Programmanalysen</strong><br />

<strong>für</strong><br />

<strong>die</strong> <strong>Qualitätssicherung</strong><br />

R. Koschke<br />

Software-<br />

Qualität<br />

<strong>Statische</strong><br />

Analyse<br />

Fehlersuche<br />

Code-Style<br />

Messung<br />

Bad Smells<br />

Architekturkonformität<br />

Ausblick<br />

Zusammenfass<br />

Literatur


Zusammenfassung<br />

Innere Qualität<br />

ist langfristig entscheidend<br />

degeneriert langsam und<br />

unbemerkt<br />

→ Software-Erosion<br />

0 5 10 15 20<br />

Systemalter (in 100 Tage)<br />

<strong>Statische</strong> Analyse<br />

ist komplementär zum Test<br />

findet Fehler<br />

bestimmt innere Qualität und macht Software-Erosion<br />

sichtbar<br />

auf Code-Ebene<br />

auf Architektur-Ebene<br />

→ integraler Bestandteil des normalen Entwicklungsprozesses<br />

Systemgröße (in 1.000 Module)<br />

5<br />

4<br />

3<br />

2<br />

1<br />

<strong>Statische</strong><br />

<strong>Programmanalysen</strong><br />

<strong>für</strong><br />

<strong>die</strong> <strong>Qualitätssicherung</strong><br />

R. Koschke<br />

Software-<br />

Qualität<br />

<strong>Statische</strong><br />

Analyse<br />

Fehlersuche<br />

Code-Style<br />

Messung<br />

Bad Smells<br />

Architekturkonformität<br />

Ausblick<br />

Zusammenfass<br />

Literatur


[Chou u. a. 2001] Chou, Andy ; Yang, Junfeng ; Chelf,<br />

Benjamin ; Hallem, Seth ; Engler, Dawson R.: An Empirical<br />

Study of Operating System Errors. In: Symposium on<br />

Operating Systems Principles, ACM Press, 2001, S. 73–88. –<br />

URL citeseer.ist.psu.edu/chou01empirical.html<br />

[Fowler 2000] Fowler, Martin: Refactoring: Improving the<br />

Design of Existing Code. Addison-Wesley, 2000<br />

[Frühauf u. a. 2000] Frühauf ; Ludewig ; Sandmayr:<br />

Software-Prüfung. 4. Auflage. vdf Zürich, 2000<br />

[ISO/IEC-Standard 9126 2001] ISO/IEC 9126-1:2001<br />

Software engineering – Product quality. 2001. – umgesetzt in<br />

DIN 66272<br />

<strong>Statische</strong><br />

<strong>Programmanalysen</strong><br />

<strong>für</strong><br />

<strong>die</strong> <strong>Qualitätssicherung</strong><br />

R. Koschke<br />

Software-<br />

Qualität<br />

<strong>Statische</strong><br />

Analyse<br />

Fehlersuche<br />

Code-Style<br />

Messung<br />

Bad Smells<br />

Architekturkonformität<br />

Ausblick<br />

Zusammenfass<br />

Literatur


[Juergens u. a. 2009] Juergens, E. ; Deissenboeck, F. ;<br />

Hummel, B. ; Wagner, S.: Do Code Clones Matter? In:<br />

International Conference on Software Engineering, ACM<br />

Press, 2009<br />

[Li u. a. 2006] Li, Z ; Lu, S ; Myagmar, S. ; Zhou, Y.:<br />

Copy-Paste and Related Bugs in Large-Scale Software Code.<br />

In: IEEE Computer Society Transactions on Software<br />

Engineering 32 (2006), März, Nr. 3, S. 176–192<br />

[Mende und Koschke 2009] Mende, Thilo ; Koschke, Rainer:<br />

Revisiting the Evaluation of Defect Prediction Models. In:<br />

Promise, 2009. – submitted for publication<br />

<strong>Statische</strong><br />

<strong>Programmanalysen</strong><br />

<strong>für</strong><br />

<strong>die</strong> <strong>Qualitätssicherung</strong><br />

R. Koschke<br />

Software-<br />

Qualität<br />

<strong>Statische</strong><br />

Analyse<br />

Fehlersuche<br />

Code-Style<br />

Messung<br />

Bad Smells<br />

Architekturkonformität<br />

Ausblick<br />

Zusammenfass<br />

Literatur


[Mende u. a. 2009] Mende, Thilo ; Koschke, Rainer ; Leszak,<br />

Marek: Evaluating Defect Prediction Models for a Large<br />

Evolving Software System. In: European Conference on<br />

Software Maintenance and Reengineering, IEEE Computer<br />

Society Press, 2009<br />

[Monden u. a. 2002] Monden, A. ; Nakae, D. ; Kamiya, T. ;<br />

Sato, S. ; Matsumoto, K.: Software quality analysis by code<br />

clones in industrial legacy software. In: Proceedings of IEEE<br />

Symposium on Software Metrics, 2002, S. 87–94<br />

[Murphy u. a. 1995] Murphy, Gail C. ; Notkin, David ;<br />

Sullivan, Kevin: Software Reflexion Models: Bridging the Gap<br />

Between Source and High-Level Models. In: Proceedings of<br />

the Third ACM SIGSOFT Symposium on the Foundations of<br />

Software Engineering. New York, NY : ACM Press, Oktober<br />

1995, S. 18–28<br />

<strong>Statische</strong><br />

<strong>Programmanalysen</strong><br />

<strong>für</strong><br />

<strong>die</strong> <strong>Qualitätssicherung</strong><br />

R. Koschke<br />

Software-<br />

Qualität<br />

<strong>Statische</strong><br />

Analyse<br />

Fehlersuche<br />

Code-Style<br />

Messung<br />

Bad Smells<br />

Architekturkonformität<br />

Ausblick<br />

Zusammenfass<br />

Literatur


[Shaw und Garlan 1993] Shaw, Mary ; Garlan, David: An<br />

Introduction to Software Architecture. In: Advances in<br />

Software Engineering and Knowledge Engineering. River<br />

Edge, NJ : World Scientific Publishing Company, 1993<br />

[Simon u. a. 2006] Simon, Frank ; Seng, Olaf ; Mohhaupt,<br />

Thomas: Code-Quality-Management – Technische Qualität<br />

industrieller Softwaresysteme transparent und vergleichbar<br />

gemacht. dpunkt.verlag, 2006<br />

<strong>Statische</strong><br />

<strong>Programmanalysen</strong><br />

<strong>für</strong><br />

<strong>die</strong> <strong>Qualitätssicherung</strong><br />

R. Koschke<br />

Software-<br />

Qualität<br />

<strong>Statische</strong><br />

Analyse<br />

Fehlersuche<br />

Code-Style<br />

Messung<br />

Bad Smells<br />

Architekturkonformität<br />

Ausblick<br />

Zusammenfass<br />

Literatur

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!