Spec# Proseminar Assertions im SS 2007 Uni Paderborn Andreas Martens Betreuer: Dipl. Inform. Björn Metzler
Inhaltsübersicht 1. Motivation 2. Spec Sharp 3. Assertions bei Spec Sharp 4. Static Verifier 5. Fazit
1.Motivation - Spec Sharp 1. von Microsoft entwickelte objektorientierte Programmiersprache. 2. ist kostenlos. 3. für die Entwicklungsumgebungen Visual Studio 2003 und Visual Studio 2005 verfügbar
Motivation Spec # ist C# Erweiterung hat einzigartige Architektur enthält Spezifikationen Ist schnell erlernbar steigert Softwarequalität
Inhaltsübersicht 1. Motivation 2. Spec Sharp 3. Assertions bei Spec Sharp 4. Static Verifier 5. 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 //Code in C# int termin; public void newTermin(int day) { termin = day; } Liefert diese Funktion ein sicheres Ergebnis?
C# Beispiel //Code in C# int termin; public void newTermin(int day) { termin = day; } 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
Inhaltsübersicht 1. Motivation 2. Spec Sharp 3. Assertions bei Spec Sharp 4. Static Verifier 5. Fazit
3. Assertions Java Java Modeling Language Invarianten Nachbedingungen Vorbedingungen … Reference types
Assertions Java Java Modeling Language Invarianten Nachbedingungen Vorbedingungen … Reference types C#
Assertions Java Java Modeling Language Invarianten Nachbedingungen Vorbedingungen … Reference types C# Spec# Invarianten Nachbedingungen Vorbedingungen … Reference types Erweiterung von C# um Spezifikationen
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# Invarianten Nachbedingungen Vorbedingungen … Reference typesNon-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;// in Spec# private string! state2 = ok";// in Spec# Zwei Strings, einer mit ! Zeichen. state1 kann null sein state2 kann aber nicht null sein
Vorbedingungen C# Spec# Invarianten Nachbedingungen Vorbedingungen … Reference types Requires Non-null Typen
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# Invarianten Nachbedingungen Vorbedingungen … Reference types Ensures Requires Non-null Typen
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# Invarianten Nachbedingungen Vorbedingungen … Reference types Objekt Invarianten Ensures Requires Non-null Typen
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. Motivation 2. Spec Sharp 3. Assertions bei Spec Sharp 4. Static Verifier 5. Fazit
4. Static Verifier Spec# Compiler Translator Verification Condition Generator Automatic Theorem Prover Spec# (annotated C#) Boogie Procedural Language Formulas Sprachneutralse Format Boogie PL Programm
Static Verifier Spec# Compiler Translator Verification Condition Generator Automatic Theorem Prover Produzierung des ausführbaren Codes Spec# (annotiertes C#) Boogie Procedural Language
Static Verifier Spec# Compiler Translator Verification Condition Generator Automatic Theorem Prover Boogie Procedural Language Umwandelung in ein sprachneutrales Format Spec# (annotiertes C#) Sprachneutralse Format
Static Verifier Spec# Compiler Translator Verification Condition Generator Automatic Theorem Prover Generierung eines Boogie PL Programm aus Spec# Boogie Procedural Language Spec# (annotiertes C#) Boogie PL Programm Sprachneutralse Format
Static Verifier Spec# Compiler Translator Verification Condition Generator Automatic Theorem Prover Einfache Sprache mit Prozeduren Boogie Procedural Language Spec# (annotiertes C#) Boogie PL Programm Sprachneutralse Format
Static Verifier Spec# Compiler Translator Verification Condition Generator Automatic Theorem Prover Umwandlung von Boogie PL Code in logische Ausdrücke (In Formeln) Boogie Procedural Language Spec# (annotiertes C#) Boogie PL Programm Formulas Sprachneutralse Format
Static Verifier Spec# Compiler Translator Verification Condition Generator Automatic Theorem Prover Boogie Procedural Language Überprüfung und Bewies von Korrektheit der Ausdrücken Formulas Spec# (annotiertes C#) Sprachneutralse Format Boogie PL Programm
Beispiel: Spec# => Boogie PL if (Bedingung) S else T Spec#: assume Bedingung; S assume !Bedingung; T Then Zweig Else Zweig BoogiePL:
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. Motivation 2. Spec Sharp 3. Assertions bei Spec Sharp 4. Static Verifier 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!