Spec# Proseminar “Assertions” im SS 2007 Uni Paderborn Andreas Martens Betreuer: Dipl. Inform. Björn Metzler Inhaltsübersicht 1. 2. 3. 4. 5. Motivation Spec Sharp Assertions bei Spec Sharp Static Verifier Fazit 1.Motivation - Spec Sharp 1. 2. 3. von Microsoft entwickelte objektorientierte Programmiersprache. ist kostenlos. für die Entwicklungsumgebungen Visual Studio 2003 und Visual Studio 2005 verfügbar Motivation ist C# Erweiterung hat einzigartige Architektur enthält Spezifikationen Spec # Ist schnell erlernbar steigert Softwarequalität Inhaltsübersicht 1. 2. 3. 4. 5. Motivation Spec Sharp Assertions bei Spec Sharp Static Verifier Fazit 2. Spec# System Das Spec Sharp Programmiersystem besteht aus: Programmiersprache Compiler statischem Programm „Beweiser“ Spec# - Programmiersprache erweiterung von C# um Spezifikationen Jedes korrektes C# Programm ist auch korrektes Spec# Programm enthält Werkzeuge zum Überprüfen der Spezifikationen zur Compile- und Laufzeit Weg zur hochqualitative Software Basiert auf .NET Plattform .NET Plattform VB.NET C# Spec# C++ … VB.NET Compiler C# Compiler Spec# Compiler C++ Compiler … Microsoft Intermediate Language (MIL) Common Language Runtime (CLR) Klassenbiblioteken (API) Betriebsystem .NET Plattform .NET Sprachen C++, C#, Spec#, Visual Basic,… Verwenden das .NET Framework Werden von entsprechendem Sprachcompiler in die Zwischensparche kompiliert C# (Sharp) Objektorientierte Sprache stammt größtenteils von C, bzw. C++ ab enthält Anlehnungen an Java erzeugt plattformunabhängige Programme hat eine automatische Ressourcenverwaltung (Garbage collector) In C# (Sharp) gibt es weder Pointer noch Mehrfachvererbung fast alles als Objekt gesehen wird, selbst die einfachen Datentypen wie ‚int’ oder ‚long’ entstehen dabei keine damit verbundene Laufzeitverluste C# Beispiel Liefert diese Funktion ein sicheres Ergebnis? //Code in C# int termin; public void newTermin(int day) { termin = day; } C# Beispiel Und was ist wenn „day“ kleiner 1 ist, oder größer als 6 ist? //Code in C# int termin; public void newTermin(int day) { termin = day; } C# Beispiel //Code in C# int termin; public void newTermin(int day) { termin = day; } Inhaltsübersicht 1. 2. 3. 4. 5. Motivation Spec Sharp Assertions bei Spec Sharp Static Verifier Fazit 3. Assertions Java Java Modeling Language Reference types Vorbedingungen Nachbedingungen Invarianten … Assertions Java C# Java Modeling Language Reference types Vorbedingungen Nachbedingungen Invarianten … Assertions Erweiterung von C# um Spezifikationen Java Java Modeling Language C# Spec# Reference types Reference types Vorbedingungen Vorbedingungen Nachbedingungen Nachbedingungen Invarianten Invarianten … … Runtime Verifier Zur Kompilierzeit - Umwandlung aller Vor-, Nachbedingungen, Invarianten Annahmen usw. in „inline“ Code Zur Laufzeit – Auslösung von Exceptions bei den verletzten Bedingungen Assertions C# Spec# Reference types Vorbedingungen Nachbedingungen Invarianten … Non-null Typen Spec# : None-null Typen Viele Fehler passieren auch dann, wenn einem Objekt ein Wert zugewiesen oder abgefragt wird, und dieses Objekt gleich ‚null’ ist. private string state1 = null; private string! state2 = „ok"; // in Spec# // in Spec# Zwei Strings, einer mit ‚!’ Zeichen. kann ‚null’ sein state2 kann aber nicht ‚null‘ sein state1 Vorbedingungen C# Spec# Reference types Non-null Typen Vorbedingungen Requires Nachbedingungen Invarianten … Spec#: Precondition In Spec# können einer Funktion Vor- und Nachbedingungen zugewiesen werde “requires” = Vorbedingung. Vorbedingung: sagt, was wahr sein muß, damit die Methode aufgerufen werden darf. int termin; public void newTermin(int day) requires (day < 7); requires (day >= 1); { termin = day; } Nachbedingungen C# Spec# Reference types Non-null Typen Vorbedingungen Requires Nachbedingungen Ensures Invarianten … Spec#: Postcondition „ensures“ = Nachbedingung. Nachbedingung: sagt, was erfüllt sein soll, wenn die Methode ohne Exceptions ausgeführt wird. int termin; public void newTermin(int day) requires (day < 7); requires (day >= 1); ensures (termin == day); { termin = day; } Spec#: Pre- und Postconditionen Pre- und Postconditionen können auch in Interface eingebaut werden: interface I { void M(int x ) requires x <= 10; } interface J { void M(int x ) requires x >= 10; } class C : I , J { void I .M(int x ) {…} void J .M(int x ) {…} } Invarianten Beispiel C# Spec# Reference types Non-null Typen Vorbedingungen Requires Nachbedingungen Ensures Invarianten Objekt Invarianten … Spec#: Objekt Invarianten Definition in Klassen, vor Methoden Gültig im Körper der entsprechenden Objekten Z.B. „invariant (7 > termintag);“ Spec#: Objekt Invarianten class Meeting { int termintag; invariant (1 <= termintag); invariant (7 > termintag); void newTermin(int day ) { termintag = day; } } Definition von Objektinvariante requires IsExposable; expose(this){ ...// Invarianten gelten nicht } Inhaltsübersicht 1. 2. 3. 4. 5. Motivation Spec Sharp Assertions bei Spec Sharp Static Verifier Fazit 4. Static Verifier Spec# (annotated C#) Spec# Compiler Sprachneutralse Format Translator Boogie PL Programm Verification Condition Generator Formulas Automatic Theorem Prover Boogie Procedural Language Static Verifier Spec# (annotiertes C#) Produzierung des ausführbaren Codes Spec# Compiler Translator Verification Condition Generator Automatic Theorem Prover Boogie Procedural Language Static Verifier Spec# (annotiertes C#) Umwandelung in ein sprachneutrales Format Spec# Compiler Sprachneutralse Format Translator Verification Condition Generator Automatic Theorem Prover Boogie Procedural Language Static Verifier Spec# (annotiertes C#) Generierung eines Boogie PL Programm aus Spec# Spec# Compiler Sprachneutralse Format Translator Boogie PL Programm Verification Condition Generator Automatic Theorem Prover Boogie Procedural Language Static Verifier Spec# (annotiertes C#) Einfache Sprache mit Prozeduren Spec# Compiler Sprachneutralse Format Translator Boogie PL Programm Verification Condition Generator Automatic Theorem Prover Boogie Procedural Language Static Verifier Spec# (annotiertes C#) Umwandlung von Boogie PL Code in logische Ausdrücke (In Formeln) Spec# Compiler Sprachneutralse Format Translator Boogie PL Programm Verification Condition Generator Formulas Automatic Theorem Prover Boogie Procedural Language Static Verifier Spec# (annotiertes C#) Überprüfung und Bewies von Korrektheit der Ausdrücken Spec# Compiler Sprachneutralse Format Translator Boogie PL Programm Verification Condition Generator Formulas Automatic Theorem Prover Boogie Procedural Language Beispiel: Spec# => Boogie PL Spec#: if (Bedingung) S else T BoogiePL: Then Zweig assume Bedingung; S assume !Bedingung; T Else Zweig Boogie PL: Code Unstrukturiertes Code Passive ::= assume Bedingung, S| assume !Bedingung, T; S ::= …; T ::= …; Bedingung ::= var id : Type; Type ::= bool; Screenshot Falsche Eingabe Vorbedingung wird nicht erfüllt Kurze Fehlererklärung Inhaltsübersicht 1. 2. 3. 4. 5. Motivation Spec Sharp Assertions bei Spec Sharp Static Verifier Fazit 5. Fazit Sichere Software mit weniger Aufwand Arbeitsverlagerung von den Testern zu den Softwareentwicklern Steigerung von Softwarequalität Syntax und Semantik von Spec# ist sehr nah zu C# liegt => Spec # ist für jeden C# - Programmierer leicht zu lernen Vielen Dank!