Computergest ützte Verifikation

22
1 Computergestützte Verifikation 21.6.2002

description

Computergest ützte Verifikation. 21.6.2002. Probleme bei der Softwareverifikation. komplexe Datentypen und Expressions Pointer und dynamische Datenstrukturen Prozeduren und Rekursion 4. Bibliotheken. Abstrakte Zust ände. c  ¬d. ¬ c  d. a  b. ¬ a  b. - PowerPoint PPT Presentation

Transcript of Computergest ützte Verifikation

Page 1: Computergest ützte Verifikation

1

Computergestützte Verifikation

21.6.2002

Page 2: Computergest ützte Verifikation

2

Probleme bei der Softwareverifikation

1. komplexe Datentypen und Expressions

2. Pointer und dynamische Datenstrukturen

3. Prozeduren und Rekursion

4. Bibliotheken

Page 3: Computergest ützte Verifikation

3

Abstrakte Zustände

a¬ b

¬ a b

¬ a¬ b

a b

c d

¬ c dc¬d

¬ c¬ d

(¬ b ¬ d)(¬ a ¬ c¬ d)

Praxis: z.B. Repräsentation abstrakter Zustände als BDD

oder: Restriktion auf einfache Konjunktionen (im Beispiel: ¬ d)

Page 4: Computergest ützte Verifikation

4

Abstrakter Nachfolger

geg.: Abstrakter Zustand a, guarded command g: x1..n:=T1..n

ges.: a’ so daß - jeder konkrete Zustand, der von einem von a repr. Zustand aus per g entsteht, von a’ repr. wird - a’ mglst. stark

a’: - false, falls a[bii]i=1..n ¬

Berechnung von a’ im allg. schwer, für Konjunktionen leichter:

- j = 1

n bj falls a[bii]i=1..n j [ xiTi]i=1..n

¬bj falls a[bii]i=1..n ¬j [ xiTi]i=1..n

true, sonst

Theorembeweiser

Page 5: Computergest ützte Verifikation

5

Beispieltypedef struct cell{ int val; struct cell* next;} * list;

list partition(list *l, int v) { list curr, prev, newl, nextCurr;

curr = * l; prev = NULL; newl = NULL; while( curr != NULL) { nextCurr = curr -> next; if(curr -> val > v) { if(prev != NULL) { prev -> next = nextCurr; } if(curr == *l) { *l = nextCurr; } curr -> next = newl;L: newl = curr; } else { prev = curr; } curr = nextCurr; } return newl;}

void partition() {bool b1,b2,b3,b4;

b1 = unknown();b3 = unknown();b2 = true;b4 = unknown();skip;while(*) { assume(!b1); skip; if(*) { assume(b3) if(*) { assume(!b2); skip; } if(*) { skip; } skip;L: skip; } else { assume(!b3); b2 = b1; b4 = b3; } b1 = unknown(); b3 = unknown(); } assume(b1);}

b1: curr==NULLb2: prev==NULLb3: curr->val>vb4: prev->val>v

AG(@L curr!=NULL AND curr->val>v AND (prev->val<=v OR prev=NULL))AG(@L !b1 AND b3 AND (!b4 OR b2))

Page 6: Computergest ützte Verifikation

6

Pointer

bisher: wpre(x := E,) = [ x E]

stimmt nicht, wenn Pointer beteiligt sind:

Beispiel: Sei p = & x; wpre(x = 3, *p > 5) != *p > 5

(für einen potentiellen Alias y) wpre(x := E, ) = ( ( &x = &y [y E]) ( &x != &y ) )

Nichtdeterminismus, es sei denn, Alias-Analyse kann eineAlternative ausschließen: “may point to”, “may not point to”

Page 7: Computergest ützte Verifikation

7

Bedingungen

IF B THEN T ELSE E END

IF * THEN assume(X); T ELSE assume(Y); END

X: das stärkste Prädikat (über den gegebenen Prädikaten) das von B impliziert wird

Y: das stärkste Prädikat (über den gegebenen Prädikaten) das von ¬B impliziert wird

zwischen X und Y kann Lücke klaffen Nichtdet.

Page 8: Computergest ützte Verifikation

8

ProzedurenBeispiel

int bar(int * q, int y) { int l1,l2; .... return l1;}

void foo(int * p, int x) { int r; ..... r = bar(p,x);}

Prädikate

bar:b1: y >= 0b2: *q <=yb3: y == l1b4: y > l2

foo:b5: *p <= 0b6: x == 0b7: r == 0

form. parrück + ref

[bool,bool] bar(b1,b2){

bool b3,b4;...return [b2,b3];

}

void foo(b5,b6){ bool b7,t1,t2,t3,t4; ... t1 = t2 = [t3,t4] = bar(t1,t2); b5 = b7 =}

bool choose(b1,b2) {if(b1) return true;

if(b2) return false;return unknown();

}

x==0 y>=0x==0 *p<=0 *q<=yx==0 ! *p<=0 ! *q<=y

choose(b6,false);choose(b6b5,b6!b5);

(y==)x==0 *q<=y *p<=0(y==)x==0 ! *q<=y ! *p<=0(y==)x==0 y==l1 r==0(y==)x==0 ! y==l1 ! r==0

choose(t3b6,t3!b6);choose(t4b6,t4!b6);

Page 9: Computergest ützte Verifikation

9

Prozeduren

Also: anfangs Prädikate der rufenden Prozeduren in Prädikate der gerufenen Prozedur übersetzen, am Ende umgekehrt

Alternativen: - Inlining (mit Tiefenbegrenzung bei Rekursion) - Fixpunktberechnung 8.2

Page 10: Computergest ützte Verifikation

10

8.2 Abstract InterpretationConcrete Interpretation = Menge der Variablenbelegungen,die an einer geg. PC-Position im Laufe des Programmsvorkommen können.

M x := E { ( \ {[x,(x)]}) {[x,(E)]}| M}

M IF B THEN M B .... M1 ELSE M ¬ B .... M2 END M1 M2

M WHILE B DO X ..... F(X) END

F’(Y) := (MF(Y)) B(M F(MB)) B.....

i=0 F’i(Ø) kleinster Fixpunkt von F’ (F’(Z) = Z)

Ø

MB

Page 11: Computergest ützte Verifikation

11

Wichtige Rechenoperationen

, und “kleinster Fixpunkt” = unendliche Vereinigung

= Rechnen auf vollständigem Verband

[M, , ] ist Verband, falls – beide Operationen komm., ass. - Absorption

ggf. neutrale Elemente

vollständig = abgeschlossen geg. unendliche Vereinigung

Verband induziert Halbordnung: x y gdw. x y = x (gdw. x y = y)

ist gr. untere Schranke, ist kl. obere Schranke von

Page 12: Computergest ützte Verifikation

12

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)

Page 13: Computergest ützte Verifikation

13

“passend” = Galois-Verbindung

Konkret: [C,,] Abstrakt: [A,,]

Abstraktionsfunktion : C AKonkretisierungsfunktion : A C

() ist Galoisverbindung, wenn (x) Y gdw. x (Y)

Insbesondere: z ((z)) (x := z, Y := (z) ) ((Z)) Z (x := (Z)), Y := Z )

– “präziseste Abstraktion” – “liberalste Interpretation”

Page 14: Computergest ützte Verifikation

14

Beispiel für Galois-Verbindung

C = Mengen ganzer Zahlen A = Intervalle reeller Zahlen

(M) := [min(M),max(M)] (Ø) = (I) := I Z

({1,2,5}) = [1,5] ([1,5]) = {1,2,3,4,5}([-,]) = {-3,-2,-1,0,1,2,3} = [-3,3]

Page 15: Computergest ützte Verifikation

15

Approximation von Funktionen

geg.: F: C C F*: A A

F* approximiert F wenn für alle x in C: F(x) (F*((x)))

Satz: Seien F, F* monoton, F* approximiert F. Sei Z kleinster Fixpunkt von F Z* kleinster Fixpunkt von F*Dann: Z (Z*)

Rechnen in einem Galois-verbundenen abstrakten Verband approximiert alle entsprechenden Rechnungen im konkreten Verband korrekt

Page 16: Computergest ützte Verifikation

16

Beispiel für abstrakte Interpretation

x = x / 2;

while(x<7) {

x = x + 3;

x = 2 * x;

}

[0,5]

[0,2]

[0,2] [0,6] [0,6]

[3,5] [3,9]

[6,10] [6,18]

[7,18]

(8,10,18) in konkreter Interpretation

wichtiger Unterschied zuModel Checking:

pro PC jederzeit nur ein Objekt

Page 17: Computergest ützte Verifikation

17

Fixpunktberechnung

nutzt nur etwas, wenn sie in endlich vielen Schrittenterminiert

Variante 1: endlicher abstrakter Verband

Variante 2: Terminierung forcieren Widening

Page 18: Computergest ützte Verifikation

18

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, ] [-, ]

Page 19: Computergest ützte Verifikation

19

Widening formal

: A A heißt Widening falls - X X Y (alle X,Y) - Y X Y (alle X,Y)

und für keine mon. wachsende Folge X0, X1, ...ist die Folge Y0 := X0 Yi+1 := Yi Xi+1stark monoton

Satz: Für jeden monotonen Operator F liefert die folgendeIteration nach endlich vielen Schritten einen Fixpunkt:X0 := , Xi+1 := Xi falls F(Xi) Xi, := Xi F(Xi) sonst

Page 20: Computergest ützte Verifikation

20

Narrowing

= den durch Widening entstandenen Schaden begrenzen:

Def.: ist Narrowing falls

x y x y x y und für keine monoton fallende Kettex0, x1, ..., ist die Folgey0 := x0, yi+1 := yi x i+1 stark monoton fallend.

Page 21: Computergest ützte Verifikation

21

Beispiel für Widening/Narrowing

int i

i = 1;[1,1]while (i < 101) {

i = i +1;

}

[a,b] [c,d] = [if c<a then - else a, if d>b then else b][a,b] [c,d] = [if a = - then c else a, if b = then d else b]

{X}X0 = X1 =X0 (( [1,1] X0 [1,1]) [- ,100]) = (( [1,1] [1,1]) [- ,100]) = [1,1]X2 = X1 (( [1,1] X1 [1,1]) [- ,100]) = [1,1] (( [1,1] [1,1] [1,1]) [- ,100]) = [1,1] [1,2] = [1, ]X3 = [1, ] (( [1,1] [1, ] [1,1]) [- ,100]) = [1, ] [1,100] = [1, ] X2

Page 22: Computergest ützte Verifikation

22

Beispiel für Widening/Narrowing

int i

i = 1;[1,1]while (i < 101) {

i = i +1;

}

[a,b] [c,d] = [if c<a then - else a, if d>b then else b][a,b] [c,d] = [if a = - then c else a, if b = then d else b]

{X}Y0 = X2 = [1, ]Y1 = Y0 (( [1,1] ( Y0 [1,1])) [- ,100]) = [1, ] [1,100] = [1,100]Y2 = Y1 (( [1,1] ( Y1 [1,1])) [- ,100]) = [1, 100 ] [1,100] = [1,100] = Y1

ultimativer Fixpunkt nach Widening und Narrowing = [1,100]