800 likes | 908 Views
Spezialvorlesung Suchalgorithmen. Thema: Suche zur Verifikation von Software Stefan Edelkamp. Struktur des Buchs. Überblick. Zweites Fazit Suchalgorithmen Zusatz: Musterdatenbankauswahl Anwendung: Verifikation von c++ Programmen Zustandsbeschreibung und Heuristiken
E N D
SpezialvorlesungSuchalgorithmen Thema: Suche zur Verifikation von Software Stefan Edelkamp
Überblick • Zweites Fazit Suchalgorithmen • Zusatz: Musterdatenbankauswahl • Anwendung: Verifikation von c++ Programmen • Zustandsbeschreibung und Heuristiken • Inkrementelle Speicherung & Adressierung • Zustandsrekonstruktion • Externalisierung und Abstraktion
Überblick • Zweites Fazit Suchalgorithmen • Zusatz: Musterdatenbankauswahl • Anwendung: Verifikation von c++ Programmen • Zustandsbeschreibung und Heuristiken • Inkrementelle Speicherung & Adressierung • Zustandsrekonstruktion • Externalisierung und Abstraktion
Zweites Fazit Suchalgorithmen • Von Vorteil: mengenbasierte (parallele, externe & symbolische) Suche in Zustandsraum. • Gesteuert durch (symbolische) Musterdatenbanken. • Verspätete Duplikatserkennung vermeidet Hashing. • Duplikatserkennungsbereichbeschränkt auf Lokalität des Graphen • Üblicherweise vollständig undoptimal. • Lösungsrekonstruktion: DACoder Zustandsdoppelung. • Problem: Nebenbedingungen und Realzeitanforderungen
Überblick • Zweites Fazit Suchalgorithmen • Zusatz: Musterdatenbankauswahl • Anwendung: Verifikation von c++ Programmen • Zustandsbeschreibung und Heuristiken • Inkrementelle Speicherung & Adressierung • Zustandsrekonstruktion • Externalisierung und Abstraktion
Überblick • Zweites Fazit Suchalgorithmen • Zusatz: Musterdatenbankauswahl • Anwendung: Verifikation von c++ Programmen • Zustandsbeschreibung und Heuristiken • Inkrementelle Speicherung & Adressierung • Zustandsrekonstruktion • Externalisierung und Abstraktion
Problematik • Manuelle Modellierungfehleranfällig • Automatische Konvertierung erfordert formale Semantik (FS) Probleme: • Meist nur Teilmenge der Semantik abgedeckt. • Fehlerpfad bezieht sich auf formales Modell, anstatt auf das eigentliche Programm. • Modellierungssprachen unterstützen nicht alle Konstrukte realer Programmiersprachen (dynamische Prozessgenerierung bzw. Speicher …)
Moderner Ansatz • Verwendung virtueller Maschinen (VM) • Model Checker nutzt VM zur kontrollierten Ausführung des Programms Vorteile • Kein eigener Übersetzer nötig (gängige Compiler) • „Modell“ entspricht exakt der eigentlichen Programmsemantik. • Gegenbeispiele leicht nachvollziehbar. • Lowlevel-Fehler können abgefangen werden. (illegale Speicherzugriffe)
Vorreiter: JPF (NASA) • „Java PathFinder“ (NASA) • Initiiert nach „Mars PathFinder“-Bug • Eigene VM
Konzept von JPF . . aload_0 iconst_0 aaload bipush 20 invokespecial #3; astore_1 aload_0 arraylength iconst_1 if_icmple 27 aload_1 . . Class foo { public static void …. int i; if(P!=NP) i=42; . } Violation found: Step 1 – foo.java: i=42; Step 2 - foo.java: . Step 3: . . JPF javac => =>
StEAM • Model Checker für (nebenläufige) C++ Programme. • Baut auf open source Projekt (ICVM). • Kein eigener Compiler, keine eigene VM. • Unterstüzt Multithreading.
Überblick • Zweites Fazit Suchalgorithmen • Zusatz: Musterdatenbankauswahl • Anwendung: Verifikation von c++ Programmen • Zustandsbeschreibung und Heuristiken • Inkrementelle Adressierung • Zustandsrekonstruktion • Externalisierung und Abstraktion
Internet C VM (ICVM) • Open-Source Projekt • Idee: Plattformunabhängikeit ohne proprietäre Sprachen wie Java oder C#. • Compiler + VM • MC68k-ähnlicher Befehlssatz (~64000 Instruktionen) • igcc (gcc für ICVM) => ELF format. • Auf Spiele ausgerichtet.
Bau eines c++ Model-Checkers • Ziele • Kontrollierte Ausführung. • Multi-Threading. • Definition von formalen Eigenschaften. • Compiler bleibt unverändert. • Vergleichbare Projekte: • Verisoft (Godefroid, Bell Labs1996-2006 Bell Laboratories, Lucent Technologies) • Polyspace (ca. 95.000$)
Kommandomuster • Annotation des Programms mit Zusatzinformation: • Quelldatei & Zeileninformation • Anmeldung eines Threads • Anfordern & Freigeben von Ressourcen (lock/unlock). • Assertions • Etc.
Implementierung int a; a++; --a; a++; --a; a=17; dea9 fdec inc1l (-532,%fp) de75 fdec dec1l (-532,%fp) dea9 fdec inc1l (-532,%fp) de75 fdec dec1l (-532,%fp) e4eb 0011 fdec movewl #0x11,(-532,%fp) igcc =>
Glob #include <assert.h> #include "MyThread.h" #define N 2 class MyThread; MyThread * t[N]; int i, glob=0; void initThreads () { BEGINATOMIC for(i=0;i<N;i++) { t[i]=new MyThread(); t[i]->start(); } ENDATOMIC } void main() { initThreads(); VASSERT(glob!=8); } #include "../src/mysrc/IVMThread.h" #include "MyThread.h" extern int running[2]; extern int glob; class IVMThread; MyThread::MyThread() : IVMThread::IVMThread() { } void MyThread::start() { run(); } void MyThread::run() { glob=(glob+1)*ID; } MyThread.cc glob.c ID=2,3 ID=1 ! Reihenfolge 2,3: glob=0,2,9 Reihenfolge 3,2: glob=0,3,8
Features • Unterstützte Fehlertypen • Deadlocks • Priviledge Violations • Illegale Speicherzugriffe • Assertion-Violations • Unterstützte Suchalgorithmen • Breitensuche • Tiefensuche • Best-first & A*
Heuristiken Wenig Expansionen gleich geringerer Platzbedarf Kürzere Fehlerpfade sind leichter nachzuvollziehen. Deadlock-Heuristiken • Most-Blocked: Maximale #blockierter Prozesse. • LockNBlock: … zusätzlich #“ge-lockter“ Ressourcen. • ReadWrite: Maximale #Lese / Schreibzugriffe auf globale Variablen.
Heuristiken • Deadlock mit BFS, DFS, best-first
Problem(e) • Ggf. sehr große Zustandsbeschreibung • Hoher Speicheraufwand zum Merken der besuchten Zustände. • Hoher Zweitaufwand für die Hashberechnung
Überblick • Zweites Fazit Suchalgorithmen • Zusatz: Musterdatenbankauswahl • Anwendung: Verifikation von c++ Programmen • Zustandsbeschreibung und Heuristiken • Inkrementelle Speicherung & Adressierung • Zustandsrekonstruktion • Externalisierung und Abstraktion
Inkrementelles Speichern • Übergänge verändern meist nur wenige Speicherzellen a=17; movewl#0x11,(-532,%fp) • => Speichere nur veränderte Komponenten explizit.
Zustandsrekonstruktion • Identifiziere Zustand mit gener. Pfad.
Zustandsrekonstruktion • Optical Telegraph, BFS
Partielles Hashing • Schneller, aber mehr Kollisionen
Partielles Hashing • Problem z.B. bei Bitstate-Hashing Hash-Vektor…00000000000000000000000000000…
Partielles Hashing • Problem z.B. bei Bitstate-Hashing s Hash-Vektor…00000000000000000000000000000…
Partielles Hashing • Problem z.B. bei Bitstate-Hashing s h(s) Hash-Vektor…00000000100000000000000000000…
Partielles Hashing • Problem z.B. bei Bitstate-Hashing s h(s) Hash-Vektor…00000000100000000000000000000…
Partielles Hashing • Problem z.B. bei Bitstate-Hashing s t h(s) Hash-Vektor…00000000100000000000000000000…
Partielles Hashing • Problem z.B. bei Bitstate-Hashing s t h(s) h(t) Hash-Vektor…00000000100000000000000000000…
Partielles Hashing • Problem z.B. bei Bitstate-Hashing s t h(s) T h(t) Hash-Vektor…00000000100000000000000000000…
Partielles Hashing • Problem z.B. bei Bitstate-Hashing s t h(s) T h(t) ! Hash-Vektor…00000000100000000000000000000…
Inkrementelles Hashing • Basiert auf: Rabin-Karp Algorithmus
Inkrementelles Hashing • Basiert auf: Rabin-Karp Algorithmus
Inkrementelles Hashing • Basiert auf: Rabin-Karp Algorithmus
Inkrementelles Hashing • Basiert auf: Rabin-Karp Algorithmus
Inkrementelles Hashing • Basiert auf: Rabin-Karp Algorithmus
Beispiel: Puzzle 1 2 3 4 1 2 3 4 5 6 7 8 5 6 7 8 9 10 11 9 10 11 12 13 14 15 12 13 14 15 vorberechnet h(S´) = ( h(S) – 12*(16^11) mod q + 12*(16^15) mod q ) mod q vorberechnet
Dynamisierung: Stapel • Einfügen und Löschen an einem Ende h(S´) = 2*3^1+1*3^2+3*3^3+3*3^4+ 1*3^5 mod q = h(S) + 1*3^5 mod q 1 3 3 1 2
Dynamisierung:Lineare Methode Einfügen: pi si Löschen: pi si
Baum-Methode h(1,2,3,1,2,2,1,2) = 4+1*3^2 + 9*3^(2+2) mod 17 = 11 h(3,1) = 3*3+1*9 mod 17= 1 h(2,2,1,2) = 9 = 6+h(2,1,2)*3^1 = 6+1*3 mod 17 h(1,2) = 1*3+2*9 mod 17 = 4 h(s) = (Σi si 3^i) mod 17 h(2) = 2*3^1 mod 17= 6
Strukturierte Zustandsvektoren Angeforderter Speicher Globale Variablen Lineare Methode Stapel Baum- Methode Statische Methode 1 4 3 3 3 3 1 1 2 2 Statische Methode