Dynamische Ableitung

Werbung
Dynamically Discovering Likely
Program Invariants to Support
Program Evolution
by M.D. Ernst, Jake Cockrell, et al
Vortrag „Proseminar Assertions“
SS 2007
Carsten Scharfe
[email protected]
Inhalt
• Einleitung
• Das Programm Daikon
• Dynamische Ableitung von Invarianten
• Teststudie
• Weitere Forschung
Einleitung  Daikon  Dynamische Ableitung  Teststudie  Weiteres
Einleitung
Invarianten spielen zentrale Rolle
Entwicklung
Evolution
• Spezifikation
(Weiterentwicklung)
• Bewahrung der
Korrektheit
• Korrektheit
• Verifizierung
• Minimierung
neuer Fehler
Invarianten
Einleitung  Daikon  Dynamische Ableitung  Teststudie  Weiteres
Wie kommen Invarianten zustande?
Bisher:
• Annotation des Entwicklers
– bei Entwurf eines Algorithmus/Änderung
– Eigenarten der Programmiersprache beachten
– zeitaufwendig
Jetzt:
• Dynamische Ableitung (nach M.D. Ernst)
– automatisiertes Verfahren (Programm Daikon)
– Analyse von Laufzeitverhalten
Einleitung  Daikon  Dynamische Ableitung  Teststudie  Weiteres
Das Daikon Programm
(dynamic conjectures)
1. Phase: Vorbereitung
Source
Code
Instrumenter
erweiterter
Code
2. Phase: Testläufe
Compiler
Programm
3. Phase: Analyse
Invariante 1
Protokoll 1
...
...
Daikon
Programm
Invariante k
Protokoll n
Test
Case 1
...
Test
Case n
Katalog von
Invarianten
Test-Suite
Einleitung  Daikon  Dynamische Ableitung  Teststudie  Weiteres
Ziele
• Ableitung von Invarianten
– prägnante Abstraktion von Datenmengen
• Besseres Verständnis
• Eigenschaften von Daten
• Denken in Invarianten
Einleitung  Daikon  Dynamische Ableitung  Teststudie  Weiteres
Beispiel:
Summe eines Arrays
(Gries, Science of Programming)
i=0;
s=0;
while (i <> n) do
s = s + b[i];
i = i + 1;
od
Vorbedingung:
Daikon-Ausgabe
(verkürzt)
n0
n 1
Nachbedingung:
s   b[ j ]
j 0
Schleifeninvariante: 0  i  n, s 
i 1
 b[ j ]
j 0
Einleitung  Daikon  Dynamische Ableitung  Teststudie  Weiteres
Ein paar Fakten
• in JAVA programmiert
• C, C++, Perl und JAVA
Vorteile
• normales Debugging
• Konzentration auf Teile des Programms
• Plattformunabhängig
Nachteile
• Source-Code ist Voraussetzung
• Beschränkt auf Invarianten im Katalog
• schwierig in der Handhabung
Einleitung  Daikon  Dynamische Ableitung  Teststudie  Weiteres
Dynamische Ableitung
• Instrumentierung
• Testläufe
– unter Verwendung von Test-Suites
• Analyse
erweitertes
Programm
Source
Code
Instrumenter
Testlauf
TestSuite
Invarianten
Protokoll
Analyse
Einleitung  Daikon  Dynamische Ableitung  Teststudie  Weiteres
Instrumentierung des Source-Codes
Code für Werte-Sampling einfügen
• Source-Code parsen
• Protokollier-Code einfügen
– Prozedureinstieg
– Schleifenkopf
– Prozedurrückkehr
• neuen Source-Code generieren
• neuen Code compilieren
Einleitung  Daikon  Dynamische Ableitung  Teststudie  Weiteres
Protokollierung von Variablen
• Variablen
– alle sichtbaren (auch globale)
– Parameter von Prozeduren
– Rückgabewerte
• Speichern in Tupel-Liste
– Tupel enthält Variablenwerte
– 1 Listeneintrag = 1 Aufruf
Einleitung  Daikon  Dynamische Ableitung  Teststudie  Weiteres
Ableitung der Invarianten
• anhand protokollierter Werte:
• an jedem Punkt
• für alle sichtbaren Variablen
• jede zutreffende Invariante potentieller Kanditat
– bis Werte der Invariante widersprechen
– dann nicht weiter betrachten
• Falsche schnell aussortiert
Einleitung  Daikon  Dynamische Ableitung  Teststudie  Weiteres
Einige Invarianten im Katalog
• eine Variable
– z.B.: x = const, x  {a,b,c}
• eine numerische Variable
– z.B. a ≤ x ≤ b, x ≠ 0
• mehrere numerische Variablen
– x = ax+b, x < y, x = y, x = fn(y), x+y, x-y
• Sequenzvariablen
– minval, maxval, Elementordnung, Summe
Einleitung  Daikon  Dynamische Ableitung  Teststudie  Weiteres
Verwendung von Test-Suites
• zufällig generiert
–
–
–
–
–
einfach, aber schlechte Abdeckung
viele Test-Cases notwendig
effektiv bei auffälligen Bugs
versagt bei vielen Programmteilen
zeigt Verhalten bei ungültigen Eingaben
• generiert durch Grammatik
– erzeugt repräsentative Testfälle
– erzielt bessere Abdeckung
– höhere Konfidenz der Invarianten
Einleitung  Daikon  Dynamische Ableitung  Teststudie  Weiteres
Eine Laufzeitanalyse
• kubisch in Anzahl der sichtbaren Variablen
– schnelle Falsifizierung von Invarianten
• linear in Anzahl der Samples
– Anzahl wie oft ein Programm ausgeführt wurde
• linear in Anzahl der instrumentierten Punkte
– kann begrenzt werden
Zeit = O((|vars|³ x falsetime + |trueinvs| x |testsuite|) x |program|)
Einleitung  Daikon  Dynamische Ableitung  Teststudie  Weiteres
Eine Teststudie
Aufgabe für Programmierer
• Modifikation eines größeren Programms
– Siemens replace Programm
• Erweiterung um zusätzlichen regulären Ausdruck
• 100 zufällige Testfälle mit Daikon analysiert
• Ausgabe als Hilfe an Programmierer geliefert
• Programmierer unabhängig
Einleitung  Daikon  Dynamische Ableitung  Teststudie  Weiteres
Ziele der Studie
• Nützlichkeit von Daikon
– bei welchen Punkten
– in welchem Maße
• Akzeptanz bei den Programmierern
– Verwendung von Daikon
Einleitung  Daikon  Dynamische Ableitung  Teststudie  Weiteres
Ergebnisse der Studie
• Bug gefunden
– ursprüngliche Test-Suite inadäquat
• Erwartungen bestätigt/widerlegt
• Änderungen validiert
– Seiteneffekte schneller entdeckt & behoben
• in Invarianten denken
• Aufmerksamkeit auf Code lenken
Einleitung  Daikon  Dynamische Ableitung  Teststudie  Weiteres
Fazit
Software Evolution deutlich vereinfacht
Aber:
•
•
•
•
•
Programm unhandlich
erfordert tiefe JAVA-Kenntnisse
keine erweiterten Typen
Erweiterung um Invarianten schwierig
Konfidenz abhängig von Test-Suites
Einleitung  Daikon  Dynamische Ableitung  Teststudie  Weiteres
Weitere Forschung zum Thema
Industriell
• Microsoft
• Sun
• Agitar
Akademisch
•
•
•
•
Stanford
Brown
Berkeley
Colorado
Einleitung  Daikon  Dynamische Ableitung  Teststudie  Weiteres
Weitere Entwicklung
seit 2001
• Mehr Invarianten
• Unterstützte Sprachen
– z.B. Perl, C++
• Steigerung von Performance
• Inkrementelle Ansätze
Einleitung  Daikon  Dynamische Ableitung  Teststudie  Weiteres
Referenzen + Links
• “The Daikon system for dynamic detection of likely invariants”,
M.D.Ernst, 2007
• “Efficient incremental algorithms for dynamic detection of likely
invariants”, Perkins, Ernst, 2004
• “Dynamically discovering likely program invariants to support program
evolution”, M.D.Ernst et. al., 2001
• Daikon Website:
http://pag.csail.mit.edu/daikon/
Herunterladen