Statische Programmanalysen für die Qualitätssicherung - Informatik ...
Statische Programmanalysen für die Qualitätssicherung - Informatik ...
Statische Programmanalysen für die Qualitätssicherung - Informatik ...
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