Dynamic Logic for an Intermediate Language: Verification, Interaction
Total Page:16
File Type:pdf, Size:1020Kb
Dynamic Logic for an Intermediate Language Verification, Interaction and Refinement zur Erlangung des akademischen Grades eines Doktors der Naturwissenschaften von der Fakultat¨ fur¨ Informatik des Karlsruher Instituts fur¨ Technologie (KIT) genehmigte Dissertation von Mattias Ulbrich aus Ludwigsburg Tag der mundlichen¨ Prufung:¨ 17. Juni 2013 Erster Gutachter: Prof. Dr. Peter H. Schmitt Karlsruher Institut fur¨ Technologie Zweite Gutachterin: Assoc. Prof. Dr. Marieke Huisman University of Twente Acknowledgements I would not have been able to compose this thesis without the help of many who contributed to it in various ways. First and foremost, I would like to express my special appreciation and gratitude to my advisor Professor Dr. Peter H. Schmitt for giving me the opportunity to undertake this dissertation project, for his continuous scientific advice and support, and for granting me so much freedom in my research. His gentle way of leading the group always made me feel at home. I am thankful to my second reviewer Assoc. Prof. Dr. Marieke Huisman for the time and energy she invested into fulfilling this role. My thanks go also to Juniorprofessor Dr. Mana Taghdiri and Professor Dr. Jorn¨ Muller-Quade¨ for their service as examiners in the defense committee. I have always very much enjoyed working together with my colleagues in the formal method groups at KIT. We had plenty of inspiring discussions, an excellent teamwork and lots of fun. My thanks go to my former colleagues Dr. Christian Engel, Dr. Benjamin Weiß and Dr. Frank Werner as well as to my current fellow researchers Thorsten Bormer, Daniel Bruns, Aboubakr Achraf El Ghazi, Dr. Stephan Falke, David Farago,´ Dr. Christoph Gladisch, Sarah Grebing, Simon Greiner, Markus Iser, Dr. Vladimir Klebanov, Tianhai Liu, Florian Merz, Christoph Scheben and Dr. Carsten Sinz. I am thankful to all students who worked with me; in particular to Timm Felden who helped me implementing parts of the ivil tool. I am grateful to Professor Dr. Bernhard Beckert for giving me the opportunity to continue my research on verification in his group at KIT. I would also like to express my thanks to the members of the KeY group with whom I was able to have interesting exchanges of thoughts, in particular to Professor Dr. Reiner Hahnle,¨ Dr. Richard Bubel, Dr. Wojciech Mostowski, Martin Hentschel, Dr. Philipp Rummer¨ and Dr. Wolfgang Ahrend. I owe my deepest gratitude to my parents and my family for the many years of their ongoing support and love without whom nothing would have been possible. Lastly and most importantly, infinitely many thanks to Martina for her love, vitality, care and constant encouragement from which I took the energy to finish this work. You are great. Karlsruhe, June 2013 Mattias Ulbrich Dynamische Logik f ¨ureine Zwischensprache Verifikation, Interaktion und Verfeinerung (Deutsche Zusammenfassung) Computerisierte Systeme spielen in unserem Alltag eine immer wichtigere Rolle. Viele werden dabei in Bereichen eingesetzt, in denen ihr korrektes Verhalten von hochster¨ Bedeutung ist, z. B. im Bereich von Medizintechnik oder der Flug- oder Automobiltechnologie. Immer haufiger¨ werden dabei sicherheitskritische Entschei- dungen automatisch von Softwaresystemen getroffen. Wenn diese fehlerhaft sind, so kann das fatale Auswirkungen haben, finanzieller Natur, oder gar Schaden an Leib und Leben von Menschen bedeuten. Diese Arbeit beschaftigt¨ sich damit, sicherzustellen, dass Software sich so verhalt,¨ wie sie sich verhalten soll. Praziser¨ gesagt beschaftigt¨ sie sich mit der deduktiven funktionalen Verifikation von Software-Implementierungen in Hinblick auf ihre formale Spezifikation. Formale Methoden sind eine Alternative zum Durchfuhren¨ von Softwaretests, wenn es darum geht, die funktionale Sicherheit von Systemen sicherzustellen. Die Methoden, die als formal“ klassifiziert werden konnen,¨ decken dabei eine große ” Bandbreite von Ansatzen¨ und Werkzeugen ab. Diese unterscheiden sich im Abstrak- tionsgrad, mit dem sie ein System beschreiben und auf ihm operieren und in der Starke¨ der Aussagen, die sie treffen. Die Starken¨ reichen von leichtgewichtiger Un- terstutzung¨ bei der Suche nach Fehlern (Bugs) bis hin zur Verifikation vollstandig¨ funktionaler Spezifikationen. Je starker¨ die von einer Analyse gemachten Aussa- gen jedoch sind, desto mehr Expertise, Zeit und Aufwand muss in ihre Verifikation investiert werden. Diese Arbeit halt¨ sich dabei im Bereich der Verifikation vollstandiger¨ funktionaler Spezifikationen auf. Dies ist ein aufwandiger¨ schwergewichtiger formaler Ansatz; dennoch ist das Ziel, eine Verifikation auf der Ebene des implementierten Program- mes zu bewerkstelligen und nicht (alleine) auf einer Abstraktion von ihm. Damit vereinigt der untersuchte Verifikationsansatz Schwierigkeiten aus zwei Gebieten: zum x einen die Probleme der Verifikation auf Implementierungsebene und zum anderen die der hohen Genauigkeit der Spezifikation. Um mit dieser hohen Komplexitat¨ besser umgehen zu konnen,¨ schlagt¨ diese Ar- beit vor, die Aufgabe der Verifikation mittels der zwei Werkzeuge Interaktion und Verfeinerung zu bandigen:¨ Interaktion Im Gegensatz zu leichtgewichtigen Ansatzen,¨ fur¨ die es charakteristisch ist, dass sie in relativ großem Rahmen mit relativ geringem Aufwand anwend- bar sind, ist die volle funktionale Verifikation signifikant aufwandiger¨ und benotigt¨ einen erfahrenen Benutzer. In dieser Arbeit wird ein interaktives Verifikationswerkzeug vorgestellt, mit dem in den Verifikationsprozess Einblick gewonnen werden kann und das dem Benutzer des Systems erlaubt, mit dem System hauptsachlich¨ in Begriffen des ursprunglichen¨ zu verifizierenden Programmes zu interagieren. Mittels inter- aktiven Eingreifens kann die automatische Komponente des Systems geleitet werden, bis sie schließlich den Bewies selbstandig¨ zu Ende fuhren¨ kann. Verfeinerung Volle funktionale Verifikation auf der Ebene von Implementierungen vereinigt zwei an sich schwere Aufgaben in einer. Wir schlagen eine Methodik vor, diesen schweren Auftrag in zwei jeweils leichtere zu unterteilen und dann die etablierte Technik der Verfeinerung zu benutzen, um aus der abstrakteren Beschreibung die Implementierung formal abzuleiten. Es gibt funktionale Korrektheitsaussagen, die am besten direkt auf der Imple- mentierung beschrieben und dort leicht gezeigt werden konnen,¨ und es gibt Korrektheitsaussagen, die von konzeptioneller Natur sind und besser auf einer Abstraktion des Programmes gezeigt werden. Um diese beiden Ziele zu erreichen, wird eine neue Programmlogik entworfen, die zwei seit langem im Bereich der Implementierungsverifikation erfolgreiche Paradig- men vereint. Zum einen ist dies die dynamische Logik, die einen sehr flexiblen Ansatz fur¨ die Formalisierung und den Beweis von Eigenschaften von Programmen darstellt. Sie ist eng verwandt mit anderen Programmlogiken wie der Hoare-Logik“ oder dem ” Weakest-Precondition-Kalkul“,¨ hat aber als besondere Eigenschaft, dass Programme ” freier kombiniert werden konnen.¨ Programme sind in dynamischer Logik Konstruk- toren fur¨ Formeln. Da die Menge der Formeln unter Komposition abgeschlossen ist, konnen¨ auch programminduzierte Formeln geschachtelt oder logisch verknupft¨ auftreten. Zum anderen wird die Verifikation auf einer elementaren, reduzierten aber allge- meinen Verifikationszwischensprache in den Ansatz mit eingebracht. Die Idee, Verifi- kationsbedingungen einer modernen Programmiersprache auf eine solche elementare Sprache zu reduzieren, scheint auf den ersten Blick einen Ruckschritt¨ darzustellen. Aber dieser Eindruck tauscht.¨ Eine schlanke und effiziente Kernsprache erlaubt es, den Verifikationsprozess vom Modellierungsprozess zu entkoppeln. Es gibt fortan xi das Verifikationswerkzeug und den Ubersetzer,¨ der die Beweisverpflichtung aus ei- nem in einer Hochsprache geschriebenen Programm und seiner Spezifikation heraus erzeugt. Die Zwischensprache verbindet die beiden Systeme. Ein prominenter Vertreter der Systeme, die auf auf dynamischer Logik beruhen, ist das KeY-System, das auf einer speziell ausgelegten dynamischen Logik fur¨ Java- Quelltext operiert. Ein erfolgreicher prototypischer Vertreter fur¨ ein Verifikations- system, das auf einer Zwischensprache agiert, ist das System Boogie, fur¨ das eine Vielzahl von Ubersetzern¨ existiert, die Beweisverpflichtungen aus einer Reihe von Quellsprachen und Systemen heraus erlaubt. Diese Arbeit stellt eine dynamische Logik im Stile von KeY vor, die auf einer Zwischensprache definiert ist, die mit der Sprache von Boogie die primitiven Anweisungen gemeinsam hat. Diese Arbeit beschreibt eine Methodik um Algorithmen in einer rein abstrak- ten, mathematischen Pseudocode-Sprache zu formulieren, wie sie aus Lehrbuchern¨ bekannt ist. Diese Algorithmen konnen¨ dann auf eine Implementierung in der Pro- grammiersprache Java verfeinert werden. Interessante funktionale Eigenschaften, die konzeptionell im Algorithmus begrundet¨ sind konnen¨ auf Ebene der mathe- matischen Modellierung beschrieben, untersucht und verifiziert werden, wobei die Implementierungsdetails bei dieser Betrachtung außen vor gelassen werden konnen.¨ Ein formaler Verfeinerungsschritt ubertr¨ agt¨ dann die Verifikationsergebnisse auf die Implementierung, ohne die Beweise auf der detaillierten Ebene erneut fuhren¨ zu mussen.¨ Der kombinierte Ansatz erlaubt eine besonders flexible Formulierung von Verifi- kationsaufgaben. Er ist flexibel in der Formulierung der der Programme, weil die Verifikationsprogrammiersprache besonders grundlegend und allgemein gehalten ist. Er ist flexibel in der