Combining Static and Dynamic Program Analysis Techniques for Checking Relational Properties

Die vorliegende Dissertation ist im Bereich der formalen Verifikation von Software angesiedelt. Sie behandelt die Uberprufung relationaler Eigenschaften von Computerprogrammen, d.h. solche Eigenschaften, die zwei oder mehr Programmausfuhrungen betrachten. Die Dissertation konzentriert sich auf zwei spezifische relationale Eigenschaften: (1) Nichtinterferenz und (2) ob ein Programm ein Slice eines anderen Programms ist. Die Nichtinterferenz-Eigenschaft besagt, dass die Ausfuhrung eines Programms mit den gleichen offentlichen Eingaben die gleichen offentlichen Ausgaben produziert und dies unabhangig von den geheimen Eingaben (z.B. eines Passworts) ist. Das bedeutet, dass die geheimen Eingaben die offentlichen Ausgaben nicht beeinflussen. Programm-Slicing ist eine Technik zur Reduzierung eines Programms durch das Entfernen von Programmbefehlen, sodass ein spezifizierter Teil des Programmverhaltens erhalten bleibt, z.B. der Wert einer Variablen in einer Instruktion in dem Programm. Die Dissertation stellt Frameworks zur Verfugung, die es dem Nutzer ermoglichen, die obigen zwei Eigenschaften fur ein gegebenes Programm zu analysieren. Die Dissertation erweitert den Stand der Technik in dem Bereich der Verifikation relationaler Eigenschaften, indem sie einerseits neue Ansatze zur Verfugung stellt und andererseits bereits existierende Ansatze miteinander kombiniert. Die Dissertation enthalt jeweils einen Teil fur die behandelten zwei relationalen Eigenschaften. $\textbf{Nichtinterferenz. }$ Das Framework zur Uberprufung der Nichtinterferenz stellt neue Ansatze fur die automatische Testgenerierung und fur das Debuggen des Programms zur Verfugung und kombiniert diese mit Ansatzen, die auf deduktiver Verifikation und Programmabhangigkeitsgraphen basieren. Der erste neue Ansatz ermoglicht die automatische Generierung von Nichtinterferenz-Tests. Er ermoglicht dem Nutzer, nach Verletzungen der Nichtinterferenz-Eigenschaft im Programm zu suchen und stellt zudem ein fur relationale Eigenschaften passendes Abdeckungskriterium fur die generierten Test-Suites zur Verfugung. Der zweite neue Ansatz ist ein relationaler Debugger zur Analyse von Nichtinterferenz-Gegenbeispielen. Er verwendet bekannte Konzepte des Programm-Debuggens und erweitert diese fur die Analyse relationaler Eigenschaften. Um den Nutzer beim Beweisen der Nichtinterferenz-Eigenschaft zu unterstutzen, kombiniert das Framework einen auf Programmabhangigkeitsgraphen basierenden Ansatz mit einem auf Logik basierenden Ansatz, der einen Theorembeweiser verwendet. Auf Programmabhangigkeitsgraphen basierende Ansatze berechnen die Abhangigkeiten zwischen den unterschiedlichen Programmteilen und uberprufen, ob die offentliche Ausgabe von der geheimen Eingabe abhangt. Im Vergleich zu logik-basierten Ansatzen skalieren programmabhangigkeitsgraphen-basierte Ansatze besser. Allerdings, konnen sie Fehlalarme melden, da sie die Programmabhangigkeiten uberapproximieren. Somit bestehen zwei weitere Beitrage des Frameworks in Kombinationen von programmabhangigkeitsgraphen- und logik basierten Ansatzen: (1) der programmabhangigkeitsgraphen basierte Ansatz vereinfacht das Programm, das danach vom logik basierten Ansatz uberpruft wird und (2) der logik basierte Ansatz beweist, dass einige vom Programmabhangigkeitsgraphen-basierten Ansatz berechnete Abhangigkeiten Uberapproximationen sind und aus der Analyse entfernt werden konnen. $\textbf{Programm-Slicing. }$ Der zweite Teil der Dissertation behandelt ein Framework fur das automatische Programm-Slicing. Wahrend die meisten zum Stand der Technik gehorenden Slicing-Ansatze nur eine syntaktische Programmanalyse durchfuhren, betrachtet dieses Framework auch die Programmsemantik und kann dadurch mehr Programmbefehle entfernen. Der erste Beitrag des Frameworks besteht aus einem Ansatz zur relationalen Verifikation, der erweitert wurde, um die Korrektheit eines Programm-Slice nachzuweisen, d.h. dass es das spezifizierte Verhalten des Originalprogramms bewahrt. Der Vorteil der Benutzung relationaler Verifikation ist, dass sie auf zwei ahnlichen Programmen automatisch lauft -- was bei einem Slice-Kandidaten und Originalprogramm der Fall ist. Somit, anders als bei den wenigen zum Stand der Technik gehorenden Ansatzen, die die Programmsemantik betrachten, ist dieser Ansatz automatisch. Der zweite Beitrag des Frameworks besteht aus einer neuen Strategie zur Generierung von Slice-Kandidaten durch durch die Verfeinerung von dynamischen Slices (fur eine Eingabe gultigen Slices) mithilfe von der relationalen Verifikation gelieferte Gegenbeispiele.