• Keine Ergebnisse gefunden

Beispiel: Reverse mittels Swap

N/A
N/A
Protected

Academic year: 2022

Aktie "Beispiel: Reverse mittels Swap"

Copied!
7
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Korrekte Software: Grundlagen und Methoden Vorlesung 11 vom 02.07.20 Spezifikation von Funktionen

Serge Autexier, Christoph Lüth Universität Bremen Sommersemester 2020

13:55:59 2020-07-14 1 [52]

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 IAusblick und Rückblick

Korrekte Software 2 [52]

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 [52]

Beispiel: Reverse mittels Swap

i n t r e v (i n t a [ ] , i n t a _ l e n ) /∗∗ pre {0<a_len};

post{. . .}; ∗/

{ i n t i ; i = 0 ;

w h i l e ( i < a _ l e n / 2 ) /∗∗ inv {. . .}; ∗/

{

swap ( a [ ] , i , a _ l e n−i ) ; i = i +1;

} r e t u r n; }

i n t swap (i n t a [ ] , i n t i , i n t j ) /∗∗ pre {i<a_lenj<a_len};

post{a[i] =\old(a[j])a[j] =\old(a[i])}

; ∗/

{

i n t b u f = a [ j ] ; a [ j ] = a [ i ] ; a [ i ] = b u f ; }

r e t u r n;

Korrekte Software 4 [52]

Beispiel: Rekursion

i n t f a c t o r i a l (i n t n ) /∗∗ pre {n≥0}

post{\result=n!} ∗/

{

i f ( n=0) r e t u r n 1 ;

e l s e r e t u r n n ∗ f a c t o r i a l ( n−1 ) ; }

Korrekte Software 5 [52]

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 6 [52]

Von Anweisungen zu Funktionen

IErweiterung unserer Kernsprache um Funktionsdefinition und Deklarationen:

FunDef::=FunHeader FunSpec+Blk FunHeader::=Type Idt(Decl)

Decl::=Type Idt Blk::={DeclStmt}

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

Rückgaben

Neue Anweisungen: Return-Anweisung

Stmt s::=l=e|c1;c2| { } |if(b)c1 elsec2

|while(b)//∗∗inv P∗/c|//∗∗{P}∗/

|return a?

(2)

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 9 [52]

Erweiterte Semantik

I Denotat einer Anweisung: Σ*(Σ∪Σ×V) Σ*(Σ∪Σ×VU) I Abbildung von Ausgangszustand Σ auf:

ISequentieller Folgezustand, oder IRückgabewert und Rückgabezustand;

IΣ und Σ×Vsinddisjunkt.

I Was ist mitvoid?

IErweiterte Werte:VU def=V+{∗}

I Komposition zweier Anweisungenf,g: Σ*(Σ∪Σ×VU):

gSf(σ)def=

g(σ0) f(σ) =σ00,v) f(σ) = (σ0,v) I Und als Mengen/partielle Funktionen formuliert:

gSf={(σ, ρ0)|(σ, σ0)∈f∧(σ0, ρ0)∈g}

∪ {(σ,(σ0,v))|(σ,(σ0,v))f}

Korrekte Software 10 [52]

Semantik von Anweisungen

[[.]]C:Stmt→Σ*(Σ∪Σ×VU) [[x=e]]C={(σ, σ[a/l])|(σ,l)∈[[x]]L,(σ,a)∈[[e]]A}

[[c1;c2]]C= [[c2]]CS[[c1]]C Komposition wie oben [[{ }]]C=IdΣ IdΣ:={(σ, σ)|σ∈Σ}

[[if(b)c0 else c1]]C={(σ, ρ0)|(σ,true)∈[[b]]B∧(σ, ρ0)∈[[c0]]C}

∪ {(σ, ρ0)|(σ,false)∈[[b]]B∧(σ, ρ0)∈[[c1]]C} mitρ0∈Σ∪Σ×VU

[[return e]]C={(σ,(σ,a))|(σ,a)∈[[e]]A} [[return]]C={(σ,(σ,∗))}

[[while(b)c]]C=fix(Γ)

Γ(ψ)def={(σ, ρ0)|(σ,true)∈[[b]]B∧(σ, ρ0)∈ψS[[c]]C}

∪ {(σ, σ)|(σ,false)∈[[b]]B}

Korrekte Software 11 [52]

Arbeitsblatt 11.1: Jetzt seid ihr mal dran. . .

I Berechnet die Denotate der folgenden Programme:

I

[[x= 3;x= 4]]C= [[x= 4]]CS[[x= 3]]C

={(σ, σ[4/x])} ◦S{(σ, σ[3/x])}

={(σ, σ[4/x])}

I

[[x= 3;returnx;x= 4]]C= [[x= 4]]CS([[returnx]]CS[[x= 3]]C)

={(σ, σ[4/x])}◦S

({(σ,(σ,a))|(σ,a)∈[[x]]A} ◦S{(σ, σ[3/x])})

={(σ, σ[4/x])} ◦S({(σ,(σ, σ(x)))} ◦S{(σ, σ[3/x])})

={(σ, σ[4/x])} ◦S{(σ,(σ[3/x], σ[3/x](x)

| {z }

3

))}

={(σ,(σ[3/x],3))}

Korrekte Software 12 [52]

Semantik von Funktionsdefinitionen

[[.]]Dfd:FunDefVn*Σ*Σ×VU Das Denotat einer Funktion ist eine Anweisung, die über den tatsächlichen Werten für die Funktionsargumente parametriert ist.

[[f(t1p1,t2p2, . . . ,tnpn)blk]]Dfdv1, . . . ,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 13 [52]

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))∈[[stmts]]C}

IVon [[stmts]]Csind nurRückgabezuständeinteressant.

IKein „fall-through“

IWas passiert ohnereturnam Ende?

IKeine Initialisierungen, Deklarationen haben (noch) keine Semantik.

Korrekte Software 14 [52]

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 presp;

Vorzustand z}|{

Σ →B

Nachbedingung postsp; Σ

|{z}

Vorzustand

× (Σ×VU)

| {z } Nachzustand und Return-Wert

→B

\old(e) Wert voneimVorzustand

\result Rückgabewertder Funktion

Korrekte Software 15 [52]

Beispiel: Fakultät

i n t f a c (i n t n ) /∗∗ pre {0≤n};

post{\result==n!};

∗/

{ i n t p ; i n t c ; p= 1 ; c= 1 ;

w h i l e ( c<= n ) /∗∗ inv {p== (c−1)!∧cn+ 1∧0<c} ∗/ { p= p∗c ;

c= c +1;

} r e t u r n p ; }

Korrekte Software 16 [52]

(3)

Beispiel: Suche

i n t f i n d m a x (i n t a [ ] , i n t a _ l e n ) /∗∗ pre {\array(a,a_len)∧0<a_len};

post{∀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 )

/∗∗ inv {(∀i.0≤i<j−→a[i]x)ja_len}; ∗/

{

i f ( a [ j ]> x ) x= a [ j ] ; j= j +1;

} r e t u r n x ; }

Korrekte Software 17 [52]

Beispiel: Suche

i n t f i n d m a x (i n t a [ ] , i n t a _ l e n ) /∗∗ pre {0<a_len};

post{\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 )

/∗∗ inv {j>0−→x= max(seq(a,j))ja_len}; ∗/

{

i f ( a [ j ]> x ) x= a [ j ] ; j= j +1;

} r e t u r n x ; }

Korrekte Software 18 [52]

Ziel: Gültigkeit von Spezifikationen

IZiel ist eineSemantik von SpezifikationenBsp[[.]] zu definieren, um damitsemantische Gültigkeitzu definieren:

preppostq|=fd

⇐⇒ ∀v1, . . . ,vn.[[fd]]DfdΓv1. . .vn∈ Bsp[[preppostq]] Γ

IΓ enthält globale Definitionen, insbesondere andere Funktionen.

I Warum?

Korrekte Software 19 [52]

Beispiel: Reverse mittels Swap

i n t r e v (i n t a [ ] , i n t a _ l e n ) /∗∗ pre {0<a_len};

post{. . .}; ∗/

{ i n t i ; i = 0 ;

w h i l e ( i < a _ l e n / 2 ) /∗∗ inv {. . .}; ∗/

{

swap ( a [ ] , i , a _ l e n−i ) ; i = i +1;

} r e t u r n; }

i n t swap (i n t a [ ] , i n t i , i n t j ) /∗∗ pre {i<a_lenj<a_len};

post{a[i] =\old(a[j])a[j] =\old(a[i])}

; ∗/

{

i n t b u f = a [ j ] ; a [ j ] = a [ i ] ; a [ i ] = b u f ; }

r e t u r n;

Korrekte Software 20 [52]

Beispiel: Rekursion

i n t f a c t o r i a l (i n t n ) /∗∗ pre {n≥0}

post{\result=n!} ∗/

{ i n t x ;

i f ( n=0) r e t u r n 1 ; e l s e {

x = f a c t o r i a l ( n−1 ) ; r e t u r n n ∗ x ; }

}

Korrekte Software 21 [52]

Semantik von Spezifikationen

I Vorbedingung: Auswertung als [[sp]]BΓ über dem Vorzustand I Nachbedingung: Erweiterung von [[.]]Bund [[.]]A

IAusdrücke können in Vor- oder Nachzustand ausgewertet werden.

I\resultkann nicht in Funktionen vom Typvoidauftreten.

Bsp[[.]] :EnvAssn*(Σ×(Σ×VU))→B Asp[[.]] :EnvAexpv*(Σ×(Σ×VU))→V

Bsp[[!b]] Γ ={((σ,(σ0,v)),true)|((σ,(σ0,v)),false)∈ Bsp[[b]]Γ}

∪ {((σ,(σ0,v)),false)|((σ,(σ0,v)),true)∈ Bsp[[b]]Γ}

Asp[[x]] Γ ={((σ,(σ0,v)), σ0(x))}

. . .

Bsp[[\old(e)]] Γ ={((σ,(σ0,v)),b)|(σ,b)∈[[e]]BΓ}

Asp[[\old(e)]] Γ ={((σ,(σ0,v)),a)|(σ,a)∈[[e]]AΓ}

Asp[[\result]] Γ ={((σ,(σ0,v)),v)}

Bsp[[preppostq]] Γ ={(σ,0,v))| (σ,true)∈[[p]]BΓ∧

((σ,(σ0,v)),true)∈ Bsp[[q]] Γ}

Korrekte Software 22 [52]

Gültigkeit von Spezifikationen

IDie Semantik von Spezifikationen erlaubt uns die Definition der semantischen Gültigkeit.

preppostq|=fd

⇐⇒ ∀v1, . . . ,vn.[[fd]]DfdΓ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

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:

I die Ausführung voncmitσinσ0regulär terminiert, so dassσ0die SpezifikationQerfüllt,

I oder die Ausführung voncinσ0mit dem Rückgabewertvterminiert, so dass (σ0,v) die RückgabespezifikationQRerfüllt.

Γ|={P}c{Q|QR} ⇐⇒

∀σ.(σ,true)∈[[P]]BΓ =⇒ ∃σ0.(σ, σ0)∈[[c]]C∧((σ,(σ0,∗),true)∈ Bsp[[Q]] Γ

∃σ0,v.(σ,0,v))∈[[c]]C∧((σ,(σ0,v)),true)∈ Bsp[[QR]] Γ

(4)

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 25 [52]

Erweiterung des Floyd-Hoare-Kalküls: Spezifikation

(Γ∧P) =P0[xi/\old(xi)] Γ` {P0}c{false|Q[\old(xi)/xi]}

Γ`f(x1, . . . ,xn)/** prePpostQ*/{ds c} IDie Parameterxiwerden inpostQper Konvention nur alsxi

referenziert, aber es ist immer der Wert imVorzustandgemeint (eigentlich\old(xi)).

IDeswegen wird inQim Hoare-Tripel ersetzt

IVariablen unterhalb von\old(.) werden bei der Substitution (Zuweisungsregel)nicht ersetzt!

I\old(.) wird beim Weakening von der VorbedingungPersetzt ISequentielle Nachbedingung voncistfalse

Korrekte Software 26 [52]

Beispiel: Suche

i n t f i n d m a x (i n t a [ ] , i n t a _ l e n ) /∗∗ pre {0<a_len};

post{\result= max(seq(a,a_len))}; ∗/

{ . . .

(Γ∧0<a_len) =P0[a/\old(a),a_len/\old(a_len)]

Γ` {P0}c{false|\result= max(seq(\old(a),\old(a_len)))}

Γ` findmax(int a[],int a_len) /** pre{0<a_len}

post{\result= max(seq(a,a_len))}*/{. . .} IWobeiP0noch Ausdrücke\old(a_len) enthalten kann,

Idie dann ersetzt werden zua_leninP0[a/\old(a),a_len/\old(a_len)]

Korrekte Software 27 [52]

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]}l=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 28 [52]

Erweiterter Floyd-Hoare-Kalkül II

Γ` {Q}return{P|Q} Γ` {Q[e/\result]}return e{P|Q}

(Γ∧P) =P0[xi/\old(xi)] Γ` {P0}c{false|Q[\old(xi)/xi]}

Γ`f(x1, . . . ,xn)/** prePpostQ*/{ds c}

Korrekte Software 29 [52]

Approximative schwächste Vorbedingung

I Erweiterung 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.

I Es gilt:

^wvc(Γ,c,Q,QR) =⇒Γ|={awp(c,Q,QR)}c{Q|QR}

I Berechnung vonawpundwvc:

awp(Γ,f(x1, . . . ,xn)/** prePpostQ*/{ds blk})def=

awp(Γ0,blk,false,Q[\old(xi)/xi]) wvc(Γ,f(x1, . . . ,xn)/** prePpostQ*/{ds blk})def=

{(Γ∧P) =⇒P0[xi/\old(xi)]} ∪wvc(Γ0,blk,false,Q[\old(xi)/xi]) Γ0def= Γ[f7→ ∀x1, . . . ,xn.(P,Q)]

P0def= awp(Γ0,blk,Q[\old(xi)/xi],Q[\old(xi)/xi])

Korrekte Software 30 [52]

Approximative schwächste Vorbedingung (Revisited)

awp(Γ,{ },Q,QR) def= Q awp(Γ,l=e,Q,QR) def= Q[e/l]

awp(Γ,c1;c2,Q,QR) def= awp(Γ,c1,awp(c2,Q,QR),QR) awp(Γ,if(b)c0 elsec1,Q,QR) def= (b∧awp(Γ,c0,Q,QR))

∨(¬b∧awp(Γ,c1,Q,QR)) awp(Γ,//∗∗{q}∗/,Q,QR) def= q

awp(Γ,while(b)//∗∗inv i∗/c,QR)def=i

awp(Γ,return e,Q,QR) def= QR[e/\result]

awp(Γ,return,Q,QR) def= QR

Korrekte Software 31 [52]

Approximative Verifikationsbedingungen (Revisited)

wvc(Γ,{ },Q,QR) def= ∅ wvc(Γ,l=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)= wvc(Γ,def c,i,QR)

∪ {Γ∧ib=⇒awp(Γ,c,i,QR)}

∪ {Γ∧i∧ ¬b=⇒Q}

wvc(Γ,return e,Q,QR) def= ∅

Korrekte Software 32 [52]

(5)

Beispiel: Fakultät

1 i n t f a c (i n t n ) 2 /∗∗ pre 0 ≤n ;

3 post \result == n ! ; ∗/

4 {

5 i n t p , c ; 6 p= 1 ; 7 c= 1 ;

8 w h i l e ( 1 ) /∗∗ inv p == ( c− 1 ) ! ; ∗/ { 9 //{p== (c−1)!∧true}

10 //E

11 //{(c==np==n!)∨(c6=npc=c!)}

12 i f ( c == n ) { r e t u r n p ; } e l s e {}

13 //{p∗c==c!}

14 p= p∗c ;

15 //{p==c!}

16 //{p== ((c+ 1)−1)!}

17 c= c +1;

18 //{p== (c−1)!}

19 }

20 }

Korrekte Software 33 [52]

Beispiel: Fakultät (berichtigt)

1 i n t f a c (i n t n ) 2 /∗∗ pre 0n ;

3 post \result == n ! ; ∗/

4 { 5 i n t p , c ; 6 p= 1 ; 7 c= 1 ;

8 w h i l e ( 1 ) /∗∗ inv p == ( c− 1 ) !0< c ; ∗/ { 9 //{p== (c1)!0<c∧true}

10 //{pc==c!∧0<c}

11 p= p∗c ;

12 // {p==c!∧0<c}

13 // {(c==np==n!∧0<c)(c6=np==c!∧0<c)}

14 i f ( c == n ) {

15 //**{c==n∧p==n!∧0<c}*/

16 //{c==np==n!}

17 r e t u r n p ;

18 } e l s e {}

19 //{p==c!∧0<c}

20 //{p== ((c−1) + 1)!0<c+ 1}

21 c= c +1;

22 //{p== (c1)!0<c}

23 }

24 }

Korrekte Software 34 [52]

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 35 [52]

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 36 [52]

Funktionsaufrufe und Rückgaben

Neue Ausdrücke und Anweisungen:

IFunktionsaufrufe

IProzeduraufrufe (mit Zuweisung eines Rückgabewertes) Aexp a::= Z|C|Lexp|a1+a2|a1a2|a1a2|a1/a2 Bexp b::=1|0|a1==a2|a1<a2|!b|b1&&b2|b1||b2

Expe:=Aexp|Bexp

Stmt c::= l=e|c1;c2| { } |if(b)c1 elsec2

| while(b)//∗∗inv a∗/c|//∗∗{a}∗/

| Idt(a)

| l=Idt(a)

| return a?

Korrekte Software 37 [52]

Zur Erinnierung: Semantik von Funktionsdefinitionen

[[.]]Dfd:FunDefVn*Σ*Σ×VU Das Denotat einer Funktion ist eine Anweisung, die über den tatsächlichen Werten für die Funktionsargumente parametriert ist.

[[f(t1p1,t2p2, . . . ,tnpn)blk]]Dfd= λv1, . . . ,vn.{(σ,(σ0,v))|

(σ,(σ0,v))∈ Dblk[[blk]]◦S{(σ, σ[v1/p1, . . . ,vn/pn])}}

IDie Funktionsargumente sind lokale Deklarationen, die mit den Aufrufwerten initialisiert werden.

IInsbesondere können sie lokal in der Funktion verändert werden.

IVonDblk[[blk]] sind nurRückgabezuständeinteressant.

IKein „fall-through“

Korrekte Software 38 [52]

Funktionsaufrufe

IAufruf einer Funktion:f(t1, . . . ,tn):

IAuswertung der Argumentet1, . . . ,tn

IEinsetzen in die Semantik [[f]]Dfd

ICall 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?

I In C: Durch Übergabe vonReferenzenalsWerte

=⇒Erfordert Modellierung des Speichermodells (nächste Vorlesung) I Wir betrachten das hier/heute nicht, somit nurreine Funktionen!

Funktionsaufrufe

IUm eine Funktionf aufzurufen, müssen wir (statisch!) die Semantik derDefinitionvonf dem Bezeichnerf zuordnen.

IDeshalb brauchen wir eineUmgebung(Environment):

Env=Id*[[FunDef]]

=Id*VN*Σ*(Σ×Vu)

IDas Environment istzusätzlicher Parameterfür alle Definitionen

(6)

Nebenbedingungen von Funktionsaufrufen

IAufruf einer nicht-definierten Funktionf oder mit falscher Anzahln von Parametern ist nicht definiert

IMuss durchstatische Analyseverhindert werden IReine Funktion(pure function):

Ikeine (sichtbaren) Seiteneffekte und Spezifikation der Form Q[\result]

. . . undQenthält nur formale Parameterinnerhalb von\old(.)

Korrekte Software 41 [52]

Semantik von Funktionsaufrufen

[[f(t1, . . . ,tn)]]AΓ ={(σ, σ0)|(σ,(σ0,v))∈Γ(f)(v1, . . . ,vn)

∧(σ,vi)∈[[ti]]AΓ}

[[x=f(t1, . . . ,tn)]]CΓ ={(σ, σ0[v/x])|(σ,(σ0,v))∈Γ(f)(v1, . . . ,vn)

∧(σ,vi)∈[[ti]]AΓ}

IAufruf von Funktion [[f(t1, . . . ,tn)]]Aignoriert Endzustand IAufruf einer rein funktionalen Prozedur [[f(t1, . . . ,tn)]]Cohne

Rückgabewert hat keinen Effekt ISomit: Kombination mit Zuweisung

IZuweisungen gehen nur anm Programmvariablen, Feldeinträge oder Struktur-Einträge vom TypZoderC.

Korrekte Software 42 [52]

Beispiel: Reverse mittels Swap geht nicht. . .

i n t r e v (i n t a [ ] , i n t a _ l e n ) /∗∗ pre {0<a_len};

post{. . .}; ∗/

{ i n t i ; i = 0 ;

w h i l e ( i < a _ l e n / 2 ) /∗∗ inv {. . .}; ∗/

{

swap ( a [ ] , i , a _ l e n−i ) ; i = i +1;

} r e t u r n; }

i n t swap (i n t a [ ] , i n t i , i n t j ) /∗∗ pre {i<a_lenj<a_len};

post{a[i] =\old(a[j])a[j] =\old(a[i])}

; ∗/

{

i n t b u f = a [ j ] ; a [ j ] = a [ i ] ; a [ i ] = b u f ; }

r e t u r n;

Korrekte Software 43 [52]

Kontext

IWir 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.

IKorrektheit gilt immer nur imKontext, dadurch kann jede Funktion separat verifiziert werden (Modularität)

Korrekte Software 44 [52]

Erweiterung des Floyd-Hoare-Kalküls: Aufruf

Γ(f) =∀x1, . . . ,xn.(P,Q) Γ` {P[ti/xi]}

l=f(t1, . . . ,tn)

{Q[ti/xi][l/\result]\old(Y)→Y|QR} IΓ mussf mit der Vor-/NachbedingungP,Qenthalten IInPundQwerden Parameterxidurch Argumentetiersetzt.

IInQwerden diexiunterhalb von\old(.) durchtiersetzt, IAlle Ausdrücke der Form\old(e) werden durcheersetzt, I\resultinQwird durchlersetzt

Korrekte Software 45 [52]

Beispiel: die Fakultätsfunktion, rekursiv

i n t f a c (i n t x ) /∗∗ pre 0≤x;

post\result=\old(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 ; }

Γ(fac) =∀x1, . . . ,xn.(0x,\result=\old(x!)) Γ` { }l=fac(2∗y){ |QR}

Korrekte Software 46 [52]

Beobachtung

IDer Aufruf einer Funktionersetztdie momentane Nachbedingung — das ist ein Problem bei Schleifen!

IWir brauchen keine Invariante mehr — ist durch die Nachbedingung gegeben

IRekursion benötigt keine Extrabehandlung

ITermination von rekursiven Funktionen wird extra gezeigt

Korrekte Software 47 [52]

Frame Rule

IKonstanzregel (Rule of Constancy):

` {P}c{Q}

` {P∧R}c{Q∧R}

INebenbedingung:cverändert keine Variablen inR

IOder: Für alle Programm-Variablenx, die inRvorkommen, gibt es keine Zuweisungx=. . .inc

IIst aber schwierig zu handhaben als Teil von wvc() IHier braucht man eine Behandlung ähnlich zum Einfügen von

Zwischenbedingungen

Korrekte Software 48 [52]

(7)

Funktionsaufrufe und Rückgaben

Neue Ausdrücke und Anweisungen:

IFunktionsaufrufe mit Zuweisung eines Rückgabewertes Stmt c::= l=e|c1;c2| { } |if(b)c1 elsec2

| while(b)//∗∗inv a∗/c|//∗∗{a}∗/

| Idt(a)

| //∗∗constR∗/l=Idt(a)

| return a?

Korrekte Software 49 [52]

Approximative schwächste Vorbedingung &

Verifikationsbedingung

Γ(f) =∀x1, . . . ,xn.(P,Q)

awp(Γ,//∗∗constR∗/l=f(t1, . . . ,tn),Q,QR)def=RP[ti/xi] wennl6∈R

wvc(Γ,//∗∗constR∗/l=f(t1, . . . ,tn),Q,QR)

={RdefQ[ti/xi][l/\result]\old(Y)→Y=⇒Q}

wennl6∈R

Korrekte Software 50 [52]

Beispiel: die Fakultätsfunktion

//{y= 5∧x= 2∗y}

/∗∗ consty= 5∧x= 2∗y ∗/

l = f a c ( x ) ; //{l= 10!}

i n t f a c (i n t x ) /∗∗ pre 0≤x;

post\result=\old(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 ; }

awp(Γ,//∗∗consty= 5∧x= 2∗y∗/l=fac(x),l= 10!,QR)

def= y= 5∧x= 2∗y∧0≤x

wvc(Γ,//∗∗consty= 5∧x= 2∗y∗/l=fac(x),l= 10!,QR)

def= {y= 5∧x= 2∗yl=x! =l= 10!}

Korrekte Software 51 [52]

Zusammenfassung

IAufruf von Funktionen:

IFunktionen ohne Seiteneffekt in Kombination mit Zuweisung IAufruf einer FunktionersetztVor/Nachbedingung IEinschränkungen

IKeine Seiteneffekte

IKeine Veränderungen von/Zuweisungen ganzen Strukturen oder Feldern IProzeduren sind unbrauchbar/überflüssig

IFazit: Funktionen sind nicht ganz so straightforward

Korrekte Software 52 [52]

Referenzen

ÄHNLICHE DOKUMENTE

Serge Autexier Christoph Lüth Korrekte Software: Grundlagen und Methoden SoSe

Serge Autexier Christoph Lüth Korrekte Software: Grundlagen und Methoden SoSe

Serge Autexier Christoph Lüth Korrekte Software: Grundlagen und Methoden SoSe

Korrekte Software: Grundlagen und Methoden Vorlesung 11 vom 19.06.18: Funktionen und Prozeduren. Serge Autexier, Christoph Lüth Universität Bremen

Korrekte Software: Grundlagen und Methoden Vorlesung 8 vom 29.05.18: Modellierung und Spezifikation.. Serge Autexier,

I return ohne Argument darf nur bei einer Nachbedingung Q auftreten, die kein \result enthält. I Bei return mit Argument ersetzt der Rückgabewert den \result in

Partial cor- rectness means that if the programs starts in a state where the precondition P holds, and it terminates, then it does so in a state which satisfies the postcondition

Korrekte Software: Grundlagen und Methoden Vorlesung 1 vom 06.04.17: Einführung.. Serge Autexier, Christoph Lüth Universität Bremen