Computergestützte Verifikation 25.6.2002
Probleme bei der Softwareverifikation komplexe Datentypen und Expressions Pointer und dynamische Datenstrukturen Prozeduren und Rekursion 4. Bibliotheken
Idee von Abstract Interpretation Rechnen im konkretem Verband Rechnen in einem “passenden” abstrakten Verband Beispiele für abstrakte Verbände: Zahlenintervalle [a,c][b,d] = [max(a,b),min(c,d)] [a,c][b,d] = [min(a,b),max(c,d)] Boolesche Funktionen mit , Zonen mit Schnitt und konvexer Hülle der Vereinigung Kreuzprodukte beliebiger Verbände (, komponentenweise)
“passend” = Galois-Verbindung Konkret: [C,,] Abstrakt: [A,,] Abstraktionsfunktion a: C A Konkretisierungsfunktion g: A C (a,g) ist Galoisverbindung, wenn a(x) Y gdw. x g(Y) Insbesondere: z g(a(z)) (x := z, Y := a(z) ) a(g(Z)) Z (x := g(Z)), Y := Z ) a – “präziseste Abstraktion” g – “liberalste Interpretation”
Widening = Zwischenergebnis bei Fixpunktberechnung bewußt vergrößern Vorteil: Terminierung in endlich vielen Schritten Nachteil: berechneter Fixpunkt ist nicht notwendigerweise der kleinste Beispiel: Widening: instabile Grenzen auf min(- 0,1)/max(0,1,) [64,70] [32,71] [1, ] [0, ] [64,70] [63,71] [1, ] [0, ] [-, ]
Narrowing = den durch Widening entstandenen Schaden begrenzen: Def.: ist Narrowing falls x y x y x y und für keine monoton fallende Kette x0, x1, ..., ist die Folge y0 := x0, yi+1 := yi x i+1 stark monoton fallend.
8.3 Shape Analysis Ziel: Abstrakte Repräsentation von Invarianten dynamischer Datenstrukturen Mittel: Abstrakte Interpretation auf geeigneter Domain meist: “summary nodes” Liste mit mind. 1 Element x sm
Beispiel für Shape-Analysis Insert in Liste: x : nichtleere Liste x malloc(y) y x x y -> n = x y x y x = y Coarsening xy
Etwas schwieriger Delete aus Liste x: nichtleere Liste Materialisierung aus begleitenden Invarianten dann einfach: y = x; x = x -> n; free(y);
Begleitende Invarianten sm(v) Location v repr. evt. mehr als ein Objekt x(v) Variable x zeigt auf Objekt v n(v1,v2) v1.n zeigt auf v2 sh(v) mehr als ein Pointer zeigt auf v r(v) v ist von einer Variable erreichbar (kein Garbage) rx(v) v ist von x erreichbar c(v) v liegt auf einem Zyklus cf.b(v) v.f -> b = &v (Doppellink) ... alles interpretiert z.B. in 3-wertiger Logik (ja – vielleicht – nein)
8.4 Slicing Ziel: Alle Programmteile streichen, die keinen Einfluß auf verifizierte Eigenschaft haben weniger Variablen (= kleinere Zustände) + weniger Übergänge statisch: geg: Kriterium = (Variable, PC) dynamisch: geg: Kriterium + Eingabe
Beispiel statisch 1 read(n); 2 i := 1; 3 sum := 0; 4 product := 1; 5 while i <= n do sum := sum + 1; product := product * i; i := i + 1; end 9 write(sum); 10 write(product); 1 read(n); 2 i := 1; 4 product := 1; 5 while i <= n do product := product * i; i := i + 1; end 10 write(product); (product,10)
Beispiel dynamisch 1 read(n); 1 read(n); 2 i := 1; 2 i := 1; 3 while i <= n do if i mod 2 = 0 then x := 17; else x := 18; i := i + 1; end 8 write(x); 1 read(n); 2 i := 1; 3 while i <= n do if i mod 2 = 0 then x := 17; else 7 i := i + 1; end 8 write(x); (8,x,n=2)
Kontrollflußgraph start read(n) sum:=0 product:=1 i<=n stop write(product) write sum sum:=sum+1 product := product*i i:=i+1
Fluss-Abhängigkeit i j x := ... :=...x... x DEF(i) x DEF(k) x REF(i) j ist flussabhängig von i
Post-Dominanz i ist post-dominiert von j falls jeder Kontrollpfad von i zu STOP durch j geht i if j
Kontrollabhängigkeit j von i kontrollabhängig falls es gibt einen Pfad von i nach j, so daß jeder Knoten außer i von j post-dominiert ist - ist ist von j nicht post-dominiert i i while j j stop stop
Iterative Lösung von Datenflußgleichungen R(i) – relevante Variablen in Knoten i S - relevante Statements B - relevante Verzweigungen R(i) += V falls Kriterium = (V,i) R(i) += {v} falls und entweder v R(j), v DEF(i), oder v REF(i), DEF(i) R(j) i j x := v R(j) j i x R(j) x := ...v...
Iterative ... Startwert für S: Alle Statements, die Variablen definieren, die bei einem direkten Nachfolger relevant sind v := v R(j)
Iterative.... Kriterium(v,5) Beispiel 1 R {} {v} Beispiel 2 R 1 x:=0 {} 2 y:= x+1 {x} 3 v := x {x} 4 z := v+1; {v} 5 output(v) {v} 1 v := 0; 2 v := 1; 3 x := v + 1; 4 y := v + 2; 5 output(v) S: {1,3} S: {2}
Iterative.... B := Alle Branch-Statements, von denen ein relevantes Statement kontrollabhängig ist dann: für alle b in B: R(b) += REF(b) S += B ... und alles von vorn
Beispiel Kriterium: (v,5) R(0) {} {v} R(1) {} {v} {v,x} 1 v := 0 3 if x < 7 then v := 1 5 output(v) S(0):{1,4} S(1):{1,2,3,4} B: {3}
Zusammenfassung Softwareverifikation essentiell: geeignete Abstraktion, Abstraktionsverfeinerung Kombination Model Checking – Static Analysis - Alias-Analyse - Abstract Interpretation - Shape Analysis - Slicing Viele Probleme, viele offen, aber auch Hoffnung Unentscheidbarkeit setzt Grenzen
Tools BANDERA BEBOP, C2BP JPF .......
9. Sonstiges Ziel: In einigen weiteren Domains Tragfähigkeit der gelernten Konzepte testen
9.1 Hybride Systeme hybrid = kontinuierliche + diskrete Variablen Hybrider Automat: h>= max h’ [ -0.8,0.9] h’ [ -0.5,0.7] h <= min Auslaufen Einlaufen (Der hier ist ein linearer Automat: x’ [c1,c2])
Hybrid vs. Timed vs Stopwatch Timed Automata sind hybride Automaten: c’ = 1 in allen Zuständen Stopwatch-Automata sind Hybride Automaten: c’ = 1 oder c’ = 0 in allen Zuständen Erreichbarkeit für hybride Automaten unentscheidbar
Verifikation linearer hybrider Automaten geometrische Abstraktionen, z.B. Polyeder – analog Zonen Tool: HyTech (Berkeley) mehrere andere geometrische Formen, u.a. Ellipsen
Verifikation allg. hybrider Automaten 1 8 5 “Flowpipe” 3 9 6 4 3,6,7 2 4 7 10 numerische Verfahren Fehlerbetrachtung notwendig Tool: CheckMate (CMU)