Korrekte Software: Grundlagen und Methoden Vorlesung 11 vom 18.06.19 Spezifikation von Funktionen
Serge Autexier, Christoph Lüth Universität Bremen Sommersemester 2019
11:27:30 2019-07-04 1 [28]
Fahrplan
IEinführung
IOperationale Semantik IDenotationale Semantik
IÄquivalenz der Operationalen und Denotationalen Semantik IDer Floyd-Hoare-Kalkül
IInvarianten und die Korrektheit des Floyd-Hoare-Kalküls IStrukturierte Datentypen
IVerifikationsbedingungen IVorwärts mit Floyd und Hoare IModellierung
ISpezifikation von Funktionen IReferenzen und Speichermodelle
IFunktionsaufrufe und das Framing-Problem IAusblick und Rückblick
Korrekte Software 2 [28]
Funktionen & Prozeduren
IFunktionensind das zentrale Modularisierungskonzept von C IKleinste Einheit
INB. Prozeduren sind nur Funktionen vom Typvoid IIn objektorientierten Sprachen: Methoden
IFunktionen mit (implizitem) erstem Parameterthis
IWie behandeln wir Funktionen?
Korrekte Software 3 [28]
Modellierung und Spezifikation von Funktionen
Wir brauchen:
1 Von Anweisungen zu Funktionen: Deklarationen und Parameter 2 Semantik von Funktionsdefinitionen
3 Spezifikation von Funktionsdefinitionen 4 Beweisregeln für Funktionsdefinitionen 5 Semantik des Funktionsaufrufs 6 Beweisregeln für Funktionsaufrufe
Korrekte Software 4 [28]
Von Anweisungen zu Funktionen
IErweiterung unserer Kernsprache um Funktionsdefinition und Deklarationen:
FunDef::=FunHeader FunSpec+Blk FunHeader::=Type Idt(Decl∗)
Decl::=Type Idt Blk::={Decl∗Stmt}
Type::=char|int|Struct|Array Struct::=struct Idt?{Decl+}
Array::=Type Idt[Aexp]
IAbstrakte Syntax
IGröße von Feldern:konstanterAusdruck IFunSpecwird später erläutert
Korrekte Software 5 [28]
Rückgaben
Neue Anweisungen: Return-Anweisung
Stmt s::=l=e|c1;c2| { } |if(b)c1 else c2
|while(b)//∗∗inv a∗/c|//∗∗{a}∗/
|return a?
Korrekte Software 6 [28]
Rückgabewerte
IProblem:returnbricht sequentiellen Kontrollfluss:
i f ( x == 0 ) r e t u r n −1;
y = y / x ; // Wird nicht immer erreicht ILösung 1: verbieten!
IMISRA-C (Guidelines for the use of the C language in critical systems):
Rule 14.7 (required)
A function shall have a single point of exit at the end of the function.
INicht immer möglich, unübersichtlicher Code . . .
ILösung 2: Erweiterung der Semantik von Σ*Σ zu Σ*(Σ + Σ×V)
Korrekte Software 7 [28]
Erweiterte Semantik
IDenotat einer Anweisung: Σ*(Σ∪Σ×V) Σ*(Σ∪Σ×VU) IAbbildung von Ausgangszustand Σ auf:
ISequentieller Folgezustand, oder IRückgabewert und Rückgabezustand;
IΣ und Σ×Vsinddisjunkt.
IWas ist mitvoid?
IErweiterte Werte:VU def=V+{∗}
IKomposition zweier Anweisungenf,g: Σ*(Σ∪Σ×VU):
g◦Sf(σ)def= (
g(σ0) f(σ) =σ0 (σ0,v) f(σ) = (σ0,v)
Korrekte Software 8 [28]
Semantik von Anweisungen
C[[.]] :Stmt→Σ*(Σ∪Σ×VU)
C[[x=e]] ={(σ, σ[a/l])|(σ,l)∈ L[[x]],(σ,a)∈ A[[e]]}
C[[c1;c2]] =C[[c2]]◦SC[[c1]] Komposition wie oben C[[{ }]] =IdΣ IdΣ:={(σ, σ)|σ∈Σ}
C[[if(b)c0 elsec1]] ={(σ, ρ0)|(σ,true)∈ B[[b]]∧(σ, ρ0)∈ C[[c0]]}
∪ {(σ, ρ0)|(σ,false)∈ B[[b]]∧(σ, ρ0)∈ C[[c1]]}
mitρ0∈Σ∪Σ×VU C[[return e]] ={(σ,(σ,a))|(σ,a)∈ A[[e]]}
C[[return]] ={(σ,(σ,∗))}
C[[while(b)c]] =fix(Γ)
Γ(ψ)=def{(σ, ρ0)|(σ,true)∈ B[[b]]∧(σ, ρ0)∈ψ◦SC[[c]]}
∪ {(σ, σ)|(σ,false)∈ B[[b]]}
Korrekte Software 9 [28]
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))|(σ[v1/p1, . . . ,vn/pn],(σ0,v))∈ Dblk[[blk]]}}
IDie Funktionsargumente sind lokale Deklarationen, die mit den Aufrufwerten initialisiert werden.
IInsbesondere können sie lokal in der Funktion verändert werden.
Korrekte Software 10 [28]
Semantik von Blöcken und Deklarationen
Blöcke bestehen aus Deklarationen und einer Anweisung.
Dblk[[.]] :Blk→Σ*(Σ×VU)
Dblk[[decls stmts]]def={(σ,(σ0,v))|(σ,(σ0,v))∈ C[[stmts]]}
IVonC[[stmts]] sind nurRückgabezuständeinteressant.
IKein „fall-through“
IWas passiert ohnereturnam Ende?
IKeine Initialisierungen, Deklarationen haben (noch) keine Semantik.
Korrekte Software 11 [28]
Spezifikation von Funktionen
IWirspezifizierenFunktionen durchVor-undNachbedingungen IÄhnlich den Hoare-Tripeln, aber vereinfachte Syntax
IBehavioural specification, angelehnt an JML, OCL, ACSL (Frama-C)
ISyntaktisch:
FunSpec::= /** preAssnpostAssn*/
Vorbedingung pre sp; Σ→B
Nachbedingung post sp; Σ×(Σ×VU)→B
\old(e) Wert voneimVorzustand
\ result Rückgabewertder Funktion
Korrekte Software 12 [28]
Beispiel: Fakultät
i n t f a c (i n t n ) /∗∗ p r e 0≤n;
p o s t \result==n! ;
∗/
{ i n t p ; i n t c ; p= 1 ; c= 1 ;
w h i l e ( c<= n ) /∗∗ i n v p== (c−1)!∧c≤n+ 1∧0<c ∗/ { p= p∗c ;
c= c +1;
} r e t u r n p ; }
Korrekte Software 13 [28]
Beispiel: Suche
i n t f i n d m a x (i n t a [ ] , i n t a _ l e n ) /∗∗ p r e \array(a,a_len)∧0<a_len;
p o s t ∀i.0≤i<a_len−→a[i]≤\result; ∗/
{
i n t x ; i n t j ; x= INT_MIN ; j= 0 ; w h i l e ( j < a _ l e n )
/∗∗ i n v (∀i.0≤i<j−→a[i]≤x)∧j≤a_len; ∗/
{
i f ( a [ j ]> x ) x= a [ j ] ; j= j +1;
} r e t u r n x ; }
Korrekte Software 14 [28]
Beispiel: Suche
i n t f i n d m a x (i n t a [ ] , i n t a _ l e n ) /∗∗ p r e 0<a_len;
p o s t \result= max(seq(a,a_len)) ; ∗/
{
i n t x ; i n t j ; x= INT_MIN ; j= 0 ; w h i l e ( j < a _ l e n )
/∗∗ i n v j>0−→x= max(Seq(a,j))∧j≤a_len; ∗/
{
i f ( a [ j ]> x ) x= a [ j ] ; j= j +1;
} r e t u r n x ; }
Korrekte Software 15 [28]
Semantik von Spezifikationen
IVorbedingung: Auswertung alsB[[sp]] Γ über dem Vorzustand INachbedingung: Erweiterung vonB[[.]] undA[[.]]
IAusdrücke können in Vor- oder Nachzustand ausgewertet werden.
I\resultkann nicht in Funktionen vom Typvoidauftreten.
Bsp[[.]] :Env→Assn*(Σ×(Σ×VU))→B Asp[[.]] :Env→Aexpv*(Σ×(Σ×VU))→V
Bsp[[!b]] Γ ={((σ,(σ0,v)),true)|((σ,(σ0,v)),false)∈ Bsp[[b]]Γ}
∪ {((σ,(σ0,v)),false)|((σ,(σ0,v)),true)∈ Bsp[[b]]Γ}
. . .
Bsp[[\old(e)]] Γ ={((σ,(σ0,v)),b)|(σ,b)∈ B[[e]] Γ}
Asp[[\old(e)]] Γ ={((σ,(σ0,v)),a)|(σ,a)∈ A[[e]] Γ}
Asp[[\ result ]] Γ ={((σ,(σ,v)),v)}
Bsp[[preppostq]] Γ ={(σ,(σ0,v))|σ∈ B[[p]] Γ∧(σ0,(σ,v))∈ Bsp[[p]] Γ}
Korrekte Software 16 [28]
Gültigkeit von Spezifikationen
IDie Semantik von Spezifikationen erlaubt uns die Definition der semantischen Gültigkeit.
preppostq|=fd
⇐⇒ ∀v1, . . . ,vn.Dfd[[fd]] Γv1. . .vn∈ Bsp[[preppostq]] Γ
IΓ enthält globale Definitionen, insbesondere andere Funktionen.
IWie passt das zu den Hoare-Tripeln|={P}c{Q}?
IWiebeweisenwir das? Erweiterungdes Hoare-Kalküls
Korrekte Software 17 [28]
Erweiterung des Floyd-Hoare-Kalküls
C[[.]] :Stmt→Σ*(Σ∪Σ×VU) Hoare-Tripel: zusätzliche Spezifikation fürRückgabewert.
Partielle Korrektheit (|={P}c{Q|QR})
cistpartiell korrekt, wenn für alle Zuständeσ, diePerfüllen:
Idie Ausführung voncmitσinσ0regulär terminiert, so dassσ0die SpezifikationQerfüllt,
Ioder die Ausführung voncinσ0mit dem Rückgabewertvterminiert, so dass (σ0,v) die RückgabespezifikationQRerfüllt.
Γ|={P}c{Q|QR} ⇐⇒
∀σ.(σ,true)∈ B[[P]] =⇒ ∃σ0.(σ, σ0)∈ C[[c]]∧(σ0,true)∈ B[[Q]]
∨
∃σ0,v.(σ,(σ0,v))∈ C[[c]]∧((σ0,v),true)∈ B[[QR]]
Korrekte Software 18 [28]
Erweiterung des Floyd-Hoare-Kalküls: return
Γ` {Q}return{P|Q} Γ` {Q[e/\result]}return e{P|Q}
IBeireturnwird die RückgabespezifikationQzur Vorbedingung, die reguläre Nachfolgespezifikation wird ignoriert, da die Ausführung von returnkein Nachfolgezustand hat.
Ireturnohne Argument darf nur bei einer NachbedingungQauftreten, die kein\resultenthält.
IBeireturnmit Argument ersetzt der Rückgabewert den\resultin der Rückgabespezifikation.
Korrekte Software 19 [28]
Erweiterung des Floyd-Hoare-Kalküls: Spezifikation
P=⇒P0[yi/\old(yi)] Γ` {P0}c{false|Q}
Γ`f(x1, . . . ,xn)/** prePpostQ*/{ds c}
IDie Parameterxiwerden per Konvention nur alsxireferenziert, aber es ist immer der Wert imVorzustandgemeint (eigentlich\old(xi)).
IVariablen unterhalb von\old(y) werden bei der Substitution (Zuweisungsregel)nicht ersetzt!
I\old(y) wird beim Weakening von der VorbedingungPersetzt ISequentielle Nachbedingung voncistfalse
Korrekte Software 20 [28]
Zusammenfassung: Erweiterter Floyd-Hoare-Kalkül
Γ` {P} {} {P|QR}
Γ` {P}c1{R|QR} Γ` {R}c2{Q|QR} Γ` {P}c1;c2{Q|QR}
Γ` {Q[e/x]}x=e{Q|QR}
Γ` {P∧b}c{P|QR} Γ` {P}while(b)c{P∧ ¬b|QR} Γ` {P∧b}c1{Q|QR} Γ` {P∧ ¬b}c2{Q|QR}
Γ` {P}if(b)c1 elsec2{Q|QR} P−→P0 Γ` {P0}c{Q0|R0} Q0−→Q R0−→R
Γ` {P}c{Q|R}
Korrekte Software 21 [28]
Erweiterter Floyd-Hoare-Kalkül II
Γ` {Q}return{P|Q} Γ` {Q[e/\result]}return e{P|Q}
P=⇒P0[yi/\old(yi)] Γ` {P0}c{false|Q}
Γ`f(x1, . . . ,xn)/** prePpostQ*/{ds c}
Korrekte Software 22 [28]
Approximative schwächste Vorbedingung
IErweiterung zu awp(Γ,c,Q,QR) und wvc(Γ,c,Q,QR) analog zu der Erweiterung der Floyd-Hoare-Regeln.
IEs werden derKontextΓ und eineRückgabespezifikationQRbenötigt.
IEs gilt:
^wvc(Γ,c,Q,QR) =⇒Γ|={awp(c,Q,QR)}c{Q|QR}
IBerechnung vonawpundwvc:
awp(Γ,f(x1, . . . ,xn)/** prePpostQ*/{ds blk})def= awp(Γ0,blk,false,Q) wvc(Γ,f(x1, . . . ,xn)/** prePpostQ*/{ds blk})def=
{P=⇒awp(Γ0,blk,Q,Q)[yj/\old(yj)]} ∪wvc(Γ0,blk,false,Q) Γ0= Γ[fdef 7→ ∀x1, . . . ,xn.(P,Q)]
Korrekte Software 23 [28]
Approximative schwächste Vorbedingung (Revisited)
awp(Γ,{ },Q,QR) def= Q awp(Γ,l=e,Q,QR) def= P[e/l]
awp(Γ,c1;c2,Q,QR) def= awp(Γ,c1,awp(c2,Q,QR),QR) awp(Γ,if(b)c0 else c1,Q,QR) def= (b∧awp(Γ,c0,Q,QR))
∨(¬b∧awp(Γ,c1,Q,QR)) awp(Γ,//∗∗{q}∗/,Q,QR) def= q
awp(Γ,while(b)//∗∗ invi∗/c,QR)=defi
awp(Γ,return e,Q,QR) def= QR[e/\result]
awp(Γ,return,Q,QR) def= QR
Korrekte Software 24 [28]
Approximative Verifikationsbedingungen (Revisited)
wvc(Γ,{ },Q,QR) =def ∅ wvc(Γ,x=e,Q,QR) =def ∅
wvc(Γ,c1;c2,Q,QR) =def wvc(Γ,c1,awp(c2,Q,QR),QR)
∪wvc(Γ,c2,Q,QR)
wvc(Γ,if(b)c1 elsec2,Q,QR) =def wvc(Γ,c1,Q,QR)∪wvc(Γ,c2,Q,QR) wvc(Γ,//∗∗{q}∗/,Q,QR) =def {q=⇒Q}
wvc(Γ,while(b)//∗∗inv i∗/c,Q,QR) def= wvc(Γ,c,i,QR)
∪ {i∧b=⇒awp(Γ,c,i,QR)}
∪ {i∧ ¬b=⇒Q}
wvc(Γ,return e,Q,QR) =def ∅
Korrekte Software 25 [28]
Beispiel: Fakultät
1 i n t f a c (i n t n ) 2 /∗∗ p r e 0≤n; 3 p o s t \result==n! ; 4 ∗/
5 { 6 i n t p ; 7 i n t c ; 8
9 p= 1 ; 10 c= 1 ;
11 w h i l e ( 1 ) /∗∗ i n v p== (c−1)!∗/ { 12 i f ( c == n ) r e t u r n p ;
13 p= p∗c ;
14 c= c +1;
15 }
16 }
Korrekte Software 26 [28]
Beispiel: Fakultät (berichtigt)
1 i n t f a c (i n t n ) 2 /∗∗ p r e 0≤n; 3 p o s t \result==n! ; 4 ∗/
5 { 6 i n t p ; 7 i n t c ; 8 9 p= 1 ; 10 c= 0 ;
11 w h i l e ( 1 ) /∗∗ i n v p==c! ∗/ { 12 i f ( c == n ) r e t u r n p ;
13 c= c +1;
14 p= p∗c ;
15 }
16 }
Korrekte Software 27 [28]
Zusammenfassung
IFunktionen sindzentrales Modularisierungskonzept IWir müssen Funktionenmodularverifizieren können IErweiterung derSemantik:
ISemantik von Deklarationen und Parameter — straightforward ISemantik vonRückgabewerten— Erweiterung der Semantik IErweiterung derSpezifikationen:
ISpezifikation von Funktionen:Vor-/Nachzustandstatt logischer Variablen IErweiterung des Hoare-Kalküls:
IEnvironment, um andere Funktionen zu nutzen IGesonderte Nachbedingung für Rückgabewert/Endzustand IEs fehlt:FunktionsaufrufundParameterübergabe
Korrekte Software 28 [28]