Automatische Verifikation von Software
Ziel
Automatische (d.h., so weit wie m ¨oglich computergest ¨utzte) Verifikation von Programmen.
Zwei Arten von Fehlern in Programmen:
Spezifische Fehler
Ein Programm tut nicht das, was es soll, d.h., es gen ¨ugt nicht seiner Spezifikation.
Automatisches Erkennen solcher Fehler scheint schwierig und erfordert zumindest auch eine vollst ¨andige Formalisierung der Spezifikation. Diese ist auch wieder fehleranf ¨allig!
Generische Fehler
Ein Programm tut gar nichts, d.h., es st ¨urzt ab“ und h ¨alt mit einer
Das Halteproblem
Problem
Entscheide, ob ein gegebenes Programm bei jeder Eingabe irgendwann anh ¨alt (d.h., dass das Programm niemals in eine Endlosschleife l ¨auft).
Ziel
Ein Programm f ¨ur das Halteproblem.
Eine konkrete Spezifikation des Halteproblems in JAVA
Eingabe: String method (Name der zu ¨uberpr ¨ufenden JAVA-Methode)
Array parametersvon Objekten (die Parame- ter, die an die Methode ¨ubergeben werden) Ausgabe: true, falls method wirklich eine Methode in
einer verf ¨ugbaren Klasse bezeichnet, parameters die richtige Zahl von Pa- rametern mit den richtigen Typen enth ¨alt und die Methode method bei Eingabe parameters(irgendwann) anh ¨alt,
falsesonst.
In JAVA:
class Halt { ...
static boolean halt(String method,
Object[] parameters) { ...
} ...
}
Wir k ¨onnen annehmen, dass die MethodehaltZugriff auf den Quellcode vonmethodhat.
Die Unentscheidbarkeit des Halteproblems
Satz 7.1
Es gibt kein JAVA-Programm, das das Halteproblem l ¨ost.
Beweis von Satz 7.1
Angenommen, es gibt ein Programm, das das Halteproblem l ¨ost. Wir k ¨onnen annehmen, dass dies mittels einer Methode
static boolean halt(String method,Object[] parameters) in einer KlasseHaltgeschieht.
Wir definieren eine neue Methodediagin einer KlasseDiag:
class Diag{
static void diag(String method) { Object[] parameters = { method };
// Eingaben bestehen nur aus // dem einen String method.
if ( Halt.halt(method,parameters) ) { while ( true ) {};
// Wenn Methode method bei // Eingabe method h¨alt,
// dann laufe in Endlosschleife.
Was passiert beim Aufruf Diag.diag("foo")
wennfooder Name einer Methode ist, die einen String als Parameter erwartet?
Diag.diag("foo")h ¨alt
⇐⇒ Halt.halt("foo",{"foo"})gibtfalsezur ¨uck
⇐⇒ foo("foo")h ¨alt nicht.
Also beim AufrufDiag.diag("Diag.diag"):
Diag.diag("Diag.diag")h ¨alt
⇐⇒ Diag.diag("Diag.diag")h ¨alt nicht.
Widerspruch!