1 Computergestützte Verifikation 21.6.2002. 2 Probleme bei der Softwareverifikation 1.komplexe Datentypen und Expressions 2.Pointer und dynamische Datenstrukturen.

Slides:



Advertisements
Ähnliche Präsentationen
Vorbereitung: struct knoten { int x; struct knoten *l, *r; } *b, *bh, **bp; b: Zeiger auf Wurzel bh: Hilfszeiger bp: Zeiger auf Zeiger auf knoten b bp.
Advertisements

Klassen - Verkettete Liste -
Kapitel 9: Graphdurchlauf
ACM ICPC Praktikum Kapitel 8: Backtracking. Übersicht Backtracking Aufzählung aller Teilmengen Aufzählung aller Permutationen n-Königinnen-Problem.
Claudio Moraga; Gisbert Dittrich
Hochschule Fulda – FB ET Sommersemester 2010
WS Prof. Dr. Th. Ottmann Algorithmentheorie 09 - Suche in Texten KMP, BM.
Durchlaufen eines Binärbaumes
Kapitel 3: Listen Lineare Liste: endliche Folge von Elementen eines Grundtyps (n>=0), leere Liste falls n=0 Listenelemente besitzen.
Imperative Programmierung
der Universität Oldenburg
Terminierung und Deadlocks Enkhbat Daginaa Betreuerin Prof. Heike Wehrheim Totale Korrektheit.
Computergestützte Verifikation
Computergestützte Verifikation
1 Computergestützte Verifikation Beispiel für Shape-Analysis Insert in Liste: x : nichtleere Liste x malloc(y) x y y -> n = x x y x = y x.
Informatik II, SS 2008 Algorithmen und Datenstrukturen Vorlesung 2 Prof. Dr. Thomas Ottmann Algorithmen & Datenstrukturen, Institut für Informatik Fakultät.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (05 – Elementare Datenstrukturen) Prof. Th. Ottmann.
Informatik II, SS 2008 Algorithmen und Datenstrukturen Vorlesung 6 Prof. Dr. Thomas Ottmann Algorithmen & Datenstrukturen, Institut für Informatik Fakultät.

Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure.
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 7 Claudio Moraga, Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 10 Claudio Moraga; Gisbert Dittrich FBI Unido
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer Diskrete Mathematik I Vorlesung Listen-
PRJ 2007/1 Stefan Dissmann Motivation Problem: gleiche Datenstrukturen werden für verschiedene Objekte gebraucht: z.B. Listen von Studierenden, Kunden,
C++ Standardbibliothek
Weiteres Programm Studium des Breitendurchlaufs Hierzu
1 Prof Dr Dr H Neunteufel Anwendungsprogrammierung II Musterlösungen.
Einführung in die Programmierung Anweisungen und Datentypen
Einfach verkettete Listen
Einfach verkettete Listen (OOP)
PRJ 2007/1 Stefan Dissmann Verkettete datenstruktur: Liste Problem: Liste, die eine beliebige Zahl von Elementen verwaltet Operationen: Erzeugen, Anfügen,
Grundkonzepte Java - Klassendefinition
Rekursion mit Listen: Quicksort
Abteilung für Telekooperation Übung Softwareentwicklung 1 für Wirtschaftsinformatik Dr. Wieland Schwinger
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Programmierung
... Unternehmens- leitung
Efficient Alias Set Analysis Using SSA Form Proseminar Programmanalyse WS 11/12 André Hunke.
Einführung in die Programmierung Wintersemester 2009/10 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure
Einführung in die Informatik für Naturwissenschaftler und Ingenieure
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Programmierung Wintersemester 2009/10 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fakultät.
Einführung in die Programmierung Wintersemester 2008/09 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fakultät.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Programmiersprache C 4
Purga - Scriptengine Ein Einblick.
Programmieren in C Dynamische Listen / Bäume
Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 1 Thomas Hilpold: Algorithmen und Datenstrukturen SS 2005 Mag.Th. Hilpold u. Dr. A.Stritzinger.
CuP - Java Sechste Vorlesung Entspricht ungefähr Kapitel 3. 1 – 3
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Computergestützte Verifikation
You need to use your mouse to see this presentation © Heidi Behrens.
Schattenspeicher S1 S2 Segmente P11 P12 P13 • • • • P1n P21 P22 P23
Java-Kurs - 4. Übung Hausaufgabe Weitere Kontrollstrukturen
2 Datenabstraktion Geheimnisprinzip:
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Algorithmen und Datenstrukturen 1 SS 2002 Mag.Thomas.
1 // Verkettete Liste 3 // demonstriert verkettete Listen und // Rekursion // (mit Entfernen eines Listenelementes) // #include struct Liste { int Element;
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Algorithmen und Datenstrukturen 1 SS 2002 Mag.Thomas.
Diskrete Mathe Diskrete Mathematik I Listen Vorlesung 4.
Fallunterscheidung und Iteration Programmierung I Prof. Dr. Michael Löwe.
1 // Verkettete Liste 2 // demonstriert verkettete Listen und // Rekursion // (Einfügen am "Fuß") // #include struct Liste { int Element; Liste *weiter;
Controller Werkstatt updaten Werkstatt ws = werkstattarray.get(werkstattId); ws.setName(name); ws.setAnsprechpartner(ansprechpartner); ws.setTelefonnummer(telefonnummer);
Pointer, Arrays und verkettete Listen. Mehrdimensionale Arrays  Pointer auf ein Array von Pointern  int32 **matrix = new int32*[3];  matrix: Zeiger.
Namensliste Teil der semantischen Aktionen
Programmieren in C Dynamische Listen / Bäume
 Präsentation transkript:

1 Computergestützte Verifikation

2 Probleme bei der Softwareverifikation 1.komplexe Datentypen und Expressions 2.Pointer und dynamische Datenstrukturen 3.Prozeduren und Rekursion 4. Bibliotheken

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)

4 Abstrakter Nachfolger geg.: Abstrakter Zustand a, guarded command g: x 1..n :=T 1..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[b i i ] i=1..n ¬ Berechnung von a im allg. schwer, für Konjunktionen leichter: - j = 1 n b j falls a[b i i ] i=1..n j [ x i T i ] i=1..n ¬b j falls a[b i i ] i=1..n ¬ j [ x i T i ] i=1..n true, sonst Theorembeweiser

5 Beispiel typedef 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==NULL b2: prev==NULL b3: curr->val>v b4: prev->val>v curr!=NULL AND curr->val>v AND (prev->val<=v OR prev=NULL)) !b1 AND b3 AND (!b4 OR b2))

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 eine Alternative ausschließen: may point to, may not point to

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.

8 Prozeduren Beispiel 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 >= 0 b2: *q <=y b3: y == l1 b4: y > l2 foo: b5: *p <= 0 b6: x == 0 b7: r == 0 form. par rü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>=0 x==0 *p<=0 *q<=y x==0 ! *p<=0 ! *q<=y choose(b6,false); choose(b6 b5,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(t3 b6,t3 !b6); choose(t4 b6,t4 !b6);

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

Abstract Interpretation Concrete Interpretation = Menge der Variablenbelegungen, die an einer geg. PC-Position im Laufe des Programms vorkommen 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) := (M F(Y)) B (M F(M B)) B..... i=0 F i (Ø) kleinster Fixpunkt von F (F(Z) = Z) Ø M B

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

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)

13 passend = Galois-Verbindung Konkret: [C,, ] Abstrakt: [A,, ] Abstraktionsfunktion : C A Konkretisierungsfunktion : 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

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]

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

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 zu Model Checking: pro PC jederzeit nur ein Objekt

17 Fixpunktberechnung nutzt nur etwas, wenn sie in endlich vielen Schritten terminiert Variante 1: endlicher abstrakter Verband Variante 2: Terminierung forcieren Widening

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

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+1 stark monoton Satz: Für jeden monotonen Operator F liefert die folgende Iteration nach endlich vielen Schritten einen Fixpunkt: X0 :=, Xi+1 := Xi falls F(Xi) Xi, := Xi F(Xi) sonst

20 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.

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

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]