Korrekte Software: Grundlagen und Methoden Vorlesung 13 vom 02.07.19 Funktionsaufrufe und das Framing-Problem
Serge Autexier, Christoph Lüth Universität Bremen Sommersemester 2019
12:15:37 2019-07-09 1 [21]
Fahrplan
I Einführung
I Operationale Semantik I Denotationale Semantik
I Äquivalenz der Operationalen und Denotationalen Semantik I Der Floyd-Hoare-Kalkül
I Invarianten und die Korrektheit des Floyd-Hoare-Kalküls I Strukturierte Datentypen
I Verifikationsbedingungen I Vorwärts mit Floyd und Hoare I Modellierung
I Spezifikation von Funktionen I Referenzen und Speichermodelle
I Funktionsaufrufe und das Framing-Problem I Ausblick und Rückblick
Korrekte Software 2 [21]
Modellierung und Spezifikation von Funktionen
Wir brauchen:
1 Deklarationen und ParameterX 2 Semantik von FunktionsdefinitionenX 3 Spezifikation von FunktionsdefinitionenX 4 Beweisregeln für FunktionsdefinitionenX 5 Semantik des Funktionsaufrufs 6 Beweisregeln für Funktionsaufrufe
Korrekte Software 3 [21]
Funktionsaufrufe und Rückgaben
Neue Ausdrücke und Anweisungen:
I Funktionsaufrufe
I Prozeduraufrufe (mit Zuweisung eines Rückgabewertes) Aexpa::= Z|C|Lexp|a1+a2|a1−a2|a1∗a2|a1/a2
| Idt(Exp∗)
Bexp b::=1|0|a1==a2|a1<a2|!b|b1&&b2|b1||b2 Expe:=Aexp|Bexp
Stmtc ::= l=e|c1;c2| { } |if(b)c1 elsec2
| while(b)//∗∗inv a∗/c|//∗∗{a}∗/
| Idt(a∗)
| l=Idt(a∗)
| returna?
Korrekte Software 4 [21]
Zur Erinnierung: Semantik von Funktionsdefinitionen
Dfd[[.]] :FunDef→Vn*Σ*Σ×VU Das Denotat einer Funktion ist eine Anweisung, die über den tatsächlichen Werten für die Funktionsargumente parametriert ist.
Dfd[[f(t1p1,t2p2, . . . ,tnpn)blk]] = λv1, . . . ,vn.{(σ,(σ0,v))|
(σ,(σ0,v))∈ Dblk[[blk]]◦S{(σ, σ[v1/p1, . . . ,vn/pn])}}
I Die Funktionsargumente sind lokale Deklarationen, die mit den Aufrufwerten initialisiert werden.
I Insbesondere können sie lokal in der Funktion verändert werden.
I VonDblk[[blk]] sind nurRückgabezuständeinteressant.
I Kein „fall-through“
Korrekte Software 5 [21]
Funktionsaufrufe
I Aufruf einer Funktion:f(t1, . . . ,tn):
IAuswertung der Argumentet1, . . . ,tn IEinsetzen in die SemantikDfd[[f]]
I Call by name, call by value, call by reference. . . ?
IC kennt nur call by value (C-Standard 99, §6.9.1. (10))
IWas ist mitSeiteneffekten?Wie können wir Werteändern?
IDurch Übergabe vonReferenzenalsWerten
Korrekte Software 6 [21]
Funktionsaufrufe
I Um eine Funktionf aufzurufen, müssen wir (statisch!) die Semantik derDefinitionvonf dem Bezeichnerf zuordnen.
I Deshalb brauchen wir eineUmgebung(Environment):
Env=Id*[[FunDef]]
=Id*VN*Σ*(Σ×Vu)
I Das Environment istzusätzlicher Parameterfür alle Definitionen
Korrekte Software 7 [21]
Nebenbedingungen von Funktionsaufrufen
I Aufruf einer nicht-definierten Funktionf oder mit falscher Anzahln von Parametern ist nicht definiert
IMuss durchstatische Analyseverhindert werden
I Aufruf einer Funktion mitSeiteneffektin einem größeren Ausdruck
IReihenfolge der Seiteneffekte unspezifiziert
IDaher hier nur für reine Funktionen I Reine Funktion(pure function):
Ikeine (sichtbaren) Seiteneffekte und Spezifikation der Form \ result = ...
Korrekte Software 8 [21]
Semantik von Funktionsaufrufen
A[[f(t1, . . . ,tn)]]Γ ={(σ,v)| ∃σ0,v.(σ,(σ0,v))∈Γ(f)(v1, . . . ,vn)
∧(σ,vi)∈ A[[ti]]Γ}
C[[f(t1, . . . ,tn)]]Γ ={(σ, σ0)| ∃σ0.(σ,(σ0,∗))∈Γ(f)(v1, . . . ,vn)
∧(σ,vi)∈ A[[ti]]Γ}
C[[x=f(t1, . . . ,tn)]]Γ ={(σ, σ0[v/x])| ∃σ0,v.(σ,(σ0,v))∈Γ(f)(v1, . . . ,vn)
∧(σ,vi)∈ A[[ti]]Γ}
I Aufruf von FunktionA[[f(t1, . . . ,tn)]] ignoriert Endzustand I Aufruf von ProzedurC[[f(t1, . . . ,tn)]] ignoriert Rückgabewert I Besser: Kombination mit Zuweisung
Korrekte Software 9 [21]
Kontext
I Wir benötigen ferner einenKontextΓ, der Funktionsbezeichnern ihre Spezifikation(Vor/Nachbedingung) zuordnet.
I Γ(f) =∀x1, . . . ,xn.(P,Q), für Funktionf(x1, . . . ,xn) mit VorbedingungPund NachbedingungQ.
I Korrektheit gilt immer nur imKontext, dadurch kann jede Funktion separat verifiziert werden (Modularität)
Korrekte Software 10 [21]
Erweiterung des Floyd-Hoare-Kalküls: Aufruf
Γ(f) =∀x1, . . . ,xn.(P,Q),f vom Typvoid Γ` {τ=σ∧P[ti#/xi]}
f(t1, . . . ,tn) {Q[τ /ρ][ti#/xi]|QR}
I Γ mussf mit der Vor-/NachbedingungP,Qenthalten I InPundQwerden Parameterxidurch Argumentetiersetzt.
I InQwird der Vorzustandρdurchτersetzt I Qdarf kein\resultenthalten
Korrekte Software 11 [21]
Erweiterung des Floyd-Hoare-Kalküls: Aufruf
Γ(f) =∀x1, . . . ,xn.(P,Q) Γ` {τ=σ∧P[ti#/xi]}
l=f(t1, . . . ,tn)
{Q[τ /ρ][ti#/xi][l#/\result]|QR}
I Γ mussf mit der Vor-/NachbedingungP,Qenthalten I InPundQwerden Parameterxidurch Argumentetiersetzt I InQwird der Vorzustandρdurchτersetzt
I \resultinQwird durchlersetzt
Korrekte Software 12 [21]
Zwei Beispiele
v o i d i n c r (i n t ∗x )
/∗∗ p o s t \old(∗x) + 1 =∗x ∗/
i n t a ; //x= 4 i n c r (&x ) ; //x= 5
v o i d swap (i n t ∗x , i n t ∗y )
/∗∗ p o s t \old(∗y) =∗x∧\old(∗x) =∗y∗/
i n t a , b ; a= 3 ; b= 5 ; swap(&a , &b ) ; //b= 3∧a= 5
Korrekte Software 13 [21]
Beispiel: die Fakultätsfunktion, rekursiv
i n t f a c (i n t x ) /∗∗ p r e 0≤x;
p o s t \result=x! ∗/
{
i n t r = 0 ;
i f ( x == 0 ) { r e t u r n 1 ; } r = f a c ( x− 1 ) ;
r e t u r n r∗ x ; }
Korrekte Software 14 [21]
Beobachtung
I Der Aufruf einer Funktionersetztdie momentane Nachbedingung — das ist ein Problem
I Wir brauchen keine Invariante mehr — ist durch die Nachbedingung gegeben
I Rekursion benötigt keine Extrabehandlung
I Termination von rekursiven Funktionen wird extra gezeigt
Korrekte Software 15 [21]
Funktionsparameter und Frame Conditions
I Problem: Funktionen könnenbeliebigeÄnderungen im Speicher vornehmen.
i n t x , y , z ; z= x+ y ; swap(&x , &y ) ;
/∗∗ { z = \ o l d ( x)+ \ o l d ( y ) } ∗/
I Vor/Nach dem Funktionsaufruf (hier swap) muss die Nachbedingung/Vorbedingung noch gelten.
Korrekte Software 16 [21]
Frame Rule
I Konstanzregel (Rule of Constancy):
` {P}c{Q}
` {P∧R}c{Q∧R}
I Nebenbedingung:cverändert keine Variablen inR
I Problem: mit Pointern können wir (syntaktisch) keine Aussagen über den Teil des Zustandes machen, dencverändert macht (framing problem)
Korrekte Software 17 [21]
Modification Sets
I Idee: Spezifiziere, welcher Teil des Zustands verändert werden darf.
I. . . denn wir könnennichtspezifizieren, was gleich bleibt.
I Syntax: modifiesMexp
Mexp::=Loc|Mexp[∗]|Mexp[i:j]|Mexp.name
IMexp sind Lexp, die auchTeilevon Feldern bezeichnen.
I Semantik: [[−]] :Env→Mexp→Σ→P(Loc) I Modification Sets werden in die Hoare-Tripelintegriert.
Korrekte Software 18 [21]
Semantik mit Modification Sets
I Hoare-Tripel mit Modification Sets:
Λ|={P}c{Q} ⇐⇒ ∀σ.P(σ)∧ ∃σ0. σ0=c(σ) =⇒Q(σ0)∧σ∼=Λσ0
I wobeiσ∼=Lτ⇐⇒ ∀l∈dom(σ)∪dom(τ)\L. σ(l) =τ(l)
I oder alternativσ∼=Lτ⇐⇒ ∀l. σ(l)6=τ(l) =⇒l∈L
Korrekte Software 19 [21]
Regeln mit Modification Sets
I Regeln werden mit Modification Set annotiert:
Γ,Λ` {P}c{Q1|Q2}
I Modification Set wird durchgereicht, aber:
Γ,Λ` {λσ.[[l]]Γ∈dom(σ)∧[[l]]Γ∈Λ∧Q(upd(σ,[[l]]Γ,[[e]]Γ))}
l=e {Q|R}
Korrekte Software 20 [21]
Zusammenfassung
I Aufruf von Funktionen:
I Funktionen mit Seiteneffekt in Kombination mit Zuweisung I Aufruf einer FunktionersetztVor/Nachbedingung
I Framing-Problem: Beschränkung der Zustandsänderung durch eine Funktion
I Erfordert weitere Erweiterung der Sprache (modification sets) I Fazit: Funktionen sind nicht ganz so straightforward
Korrekte Software 21 [21]