• Keine Ergebnisse gefunden

Korrekte Software: Grundlagen und Methoden Vorlesung 10 vom 12.06.17: Verifikationsbedingungen Revisited

N/A
N/A
Protected

Academic year: 2022

Aktie "Korrekte Software: Grundlagen und Methoden Vorlesung 10 vom 12.06.17: Verifikationsbedingungen Revisited"

Copied!
14
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Korrekte Software: Grundlagen und Methoden

Vorlesung 10 vom 12.06.17: Verifikationsbedingungen Revisited

Serge Autexier, Christoph Lüth

Universität Bremen

Sommersemester 2017

(2)

Fahrplan

I Einführung

I Die Floyd-Hoare-Logik

I Operationale Semantik

I Denotationale Semantik

I Äquivalenz der Operationalen und Denotationalen Semantik

I Korrektheit des Hoare-Kalküls

I Vorwärts und Rückwärts mit Floyd und Hoare

I Funktionen und Prozeduren

I Referenzen und Speichermodelle

I Verifikationsbedingungen Revisited

I Vorwärtsrechnung Revisited

I Programmsicherheit und Frame Conditions

I Ausblick und Rückblick

(3)

Heute

I Der Hoare-Kalkül ist viel Schreibarbeit

I Deshalb haben wir Verifikationsbedingungen berechnet:

I

Approximative schwächste Vorbedingung

I

Approximative stärkste Nachbedingung

I Mit Zeigern ist rückwärts nicht das beste . . .

(4)

Formal: Konversion in Zustandsprädikate

(−) : LexpLexp v = v (v Variable) l .id = l .id

l [e] = l [e # ]

∗l = l #

(−) # : AexpAexp

e # = read(σ, e ) (e ∈ Lexp) n # = n

v # = v (v logische Variable)

&e # = e

e 1 + e 2 # = e 1 # + e 2 #

\result # = \result

\old(e) # = \old(e )

Γ ` {Q[upd(σ, x , e # )/σ]} x = e {Q|R}

(5)

Approximative schwächste Vorbedingung

I Für die Berechnung der approximativen schwächsten Vorbedingung (AWP) und der Verifikationsbedingungen (WVC) müssen zwei Anpassungen vorgenommen werden:

I

Sowohl AWP als auch WVC berechnen symbolische Zustandsprädikate.

I

Die Zuweisungsregel muss angepasst werden.

I Berechnung von awp und wvc:

awp(Γ, f (x 1 , . . . , x n )/** pre P post Q */ {ds blk})

def

= awp(Γ 0 , blk, Q # , Q # ) wvc(Γ, f (x 1 , . . . , x n )/** pre P post Q */ {ds blk})

def

={P # = ⇒ awp(Γ 0 , blk, Q # , Q # )[e j # / \old(e j )]}

∪ wvc(Γ 0 , blk, Q # , Q # )

Γ 0

def

= Γ[f 7→ ∀x 1 , . . . , x n . (P , Q)]

(6)

Approximative schwächste Vorbedingung (Revisited)

awp(Γ, { }, Q, Q R )

def

= Q

awp(Γ, l = f (e 1 , . . . , e n ), Q, Q R )

def

= P[e i /x i ] #

mit Γ(f ) = ∀x 1 , . . . , x n . (P , R) awp(Γ, f (e 1 , . . . , e n ), Q, Q R )

def

= P[e i /x i ] #

mit Γ(f ) = ∀x 1 , . . . , x n . (P , R) awp(Γ, l = e, Q, Q R )

def

= Q[upd(σ, l , e # )/σ]

awp(Γ, {c c s }, Q, Q R )

def

= awp(Γ, c , awp({c s }, Q, Q R ), Q R ) awp(Γ, if (b ) {c 0 } else {c 1 }, Q, Q R )

def

= ( b # && awp(Γ, c 0 , Q, Q R ))

|| ( ! b # && awp(Γ, c 1 , Q, Q R )) awp(Γ, /∗∗ {q} ∗/ , Q, Q R )

def

= q

awp(Γ,

while (b ) /∗∗ inv i ∗/

c

, Q, Q R )

def

= i

awp(Γ, return e, Q, Q R )

def

= Q R [e # / \result]

awp(Γ, return, Q, Q R )

def

= Q R

(7)

Approximative Verifikationsbedingungen (Revisited)

wvc(Γ, { }, Q, Q R ) =

def

∅ wvc(Γ, x = e , Q, Q R ) =

def

wvc(Γ, x = f (e 1 , . . . , e n ), Q, Q R ) =

def

{ (R[e i /x i ][x/ \result]) # = ⇒ Q}

mit Γ(f ) = ∀x 1 , . . . , x n . (P , R) wvc(Γ, f (e 1 , . . . , e n ), Q, Q R ) =

def

{ (R[e i /x i ]) # = ⇒ Q}

mit Γ(f ) = ∀x 1 , . . . , x n . (P , R)

wvc(Γ, {c c s }, Q, Q R ) =

def

wvc(Γ, c , awp(Γ, {c s }, Q, Q R ), Q R )

∪ wvc(Γ, {c s }, Q, Q R ) wvc(Γ, if (b) c 0 else c 1 , Q, Q R ) =

def

wvc(Γ, c 0 , Q, Q R )

∪ wvc(Γ, c 1 , Q, Q R ) wvc(Γ, /∗∗ {q} ∗/ , Q, Q R ) =

def

{q = ⇒ Q}

wvc(Γ, while (b) /∗∗ inv i ∗/ c, Q, Q R ) = wvc(Γ,

def

c , i )

∪ {i ∧ b # = ⇒ awp(Γ, c, i, Q R )}

∪ {i ∧ ! b # = ⇒ Q}

wvc(Γ, return e , Q, Q R ) =

def

(8)

Beispiel: swap

v o i d swap ( i n t ∗x , i n t ∗ y ) / ∗ ∗ p r e \ v a l i d ( ∗ x ) ;

p r e \ v a l i d ( ∗ x ) ; ∗/

/ ∗ ∗ p o s t \ o l d ( ∗ x ) == ∗ y

&& \ o l d ( ∗ y ) == ∗ x ; ∗ / {

i n t z ; z= ∗ x ;

∗ x= ∗ y ;

∗ y= z ;

}

(9)

swap I

v o i d swap (i n t ∗x , i n t ∗y ) /∗∗ p r e \ v a l i d (∗x ) ;

p r e \ v a l i d (∗x ) ; ∗/

/∗∗ p o s t \ o l d (∗x ) ==∗y

&& \ o l d (∗y ) == x ; ∗/

{ i n t z ; z=∗x ;

∗x=∗y ;

∗y= z ; }

G = [ swap |−−> \ f o r a l l x , y . ( P = \ v a l i d (∗x ) && \ v a l i d (∗y ) , Q = \o l d(∗x ) ==∗y && \o l d(∗y ) == x ) ] Q# = {\o l d(∗x ) == r e a d ( s , r e a d ( s , y ) ) && \o l d(∗y ) == r e a d ( s , r e a d ( s , x ) ) }

∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗

(A) awp (G , z =∗x ; ∗x =∗y ; ∗y = z , Q#, Q#)

= awp ( G , z = ∗x , awp (G , ∗x =∗y , awp ( G , ∗y = z , Q#, Q#) , Q#) , Q#) // Siehe Einzelberehcnungen unten

= { \o l d(∗x ) == r e a d ( s , r e a d ( s , x ) ) && \o l d(∗y ) == r e a d ( s , r e a d ( s , y ) ) }

(A . 1 ) awp (G , ∗y = z , Q#, Q#)

= { l e t s 3=Upd ( s2 , r e a d ( s2 , y ) , r e a d ( s2 , z ) ) ;

i n \o l d(∗x ) == r e a d ( s3 , r e a d ( s3 , y ) ) && \o l d(∗y ) == r e a d ( s3 , r e a d ( s3 , x ) ) } Da : r e a d ( s3 , y ) = r e a d ( Upd ( s2 , r e a d ( s2 , y ) , r e a d ( s2 , z ) ) , y )

= r e a d ( s3 , y ) // da y != read(s2, y)

A l s o : r e a d ( s3 , r e a d ( s3 , y ) ) = r e a d ( s3 , r e a d ( s2 , y ) ) = r e a d ( s2 , z )

(10)

swap II

= { l e t s 3=Upd ( s2 , r e a d ( s2 , y ) , r e a d ( s2 , z ) ) ;

i n \o l d(∗x ) == r e a d ( s2 , z ) && \o l d(∗y ) == r e a d ( s3 , r e a d ( s3 , x ) ) }

= Q1

(A . 2 ) awp (G , ∗x =∗y , Q1 , Q#)

= { l e t s 2=Upd ( s1 , r e a d ( s1 , x ) , r e a d ( s1 , r e a d ( s1 , y ) ) ; l e t s 3=Upd ( s2 , r e a d ( s2 , y ) , r e a d ( s2 , z ) ) ;

i n \o l d(∗x ) == r e a d ( s2 , z ) && \o l d(∗y ) == r e a d ( s3 , r e a d ( s3 , x ) ) } Da : r e a d ( s3 , x ) = r e a d ( s2 , x ) // x != read(s2, y)

r e a d ( s2 , x ) = r e a d ( s1 , x ) // x != read(s1, x) r e a d ( s2 , z ) = r e a d ( s1 , z ) // z != read(s1, x)

= { l e t s 2=Upd ( s1 , r e a d ( s1 , x ) , r e a d ( s1 , r e a d ( s1 , y ) ) ; l e t s 3=Upd ( s2 , r e a d ( s2 , y ) , r e a d ( s2 , z ) ) ;

i n \o l d(∗x ) == r e a d ( s1 , z ) && \o l d(∗y ) == r e a d ( s3 , r e a d ( s1 , x ) ) }

= Q2

(A . 3 ) awp (G , z =∗x , Q2 , Q#)

= { l e t s 1=Upd ( s , z , r e a d ( s , r e a d ( s , x ) ) ) ;

l e t s 2=Upd ( s1 , r e a d ( s1 , x ) , r e a d ( s1 , r e a d ( s1 , y ) ) ; l e t s 3=Upd ( s2 , r e a d ( s2 , y ) , r e a d ( s2 , z ) ) ;

i n \o l d(∗x ) == r e a d ( s1 , z ) && \o l d(∗y ) == r e a d ( s3 , r e a d ( s1 , x ) ) } Da : r e a d ( s1 , z ) = r e a d ( s , r e a d ( s , x ) )

= { l e t s 1=Upd ( s , z , r e a d ( s , r e a d ( s , x ) ) ) ;

l e t s 2=Upd ( s1 , r e a d ( s1 , x ) , r e a d ( s1 , r e a d ( s1 , y ) ) ; l e t s 3=Upd ( s2 , r e a d ( s2 , y ) , r e a d ( s2 , z ) ) ;

i n \o l d(∗x ) == r e a d ( s , r e a d ( s , x ) ) && \o l d(∗y ) == r e a d ( s3 , r e a d ( s1 , x ) ) } Es g i l t : r e a d ( s2 , r e a d ( s1 , x ) ) = r e a d ( s1 , r e a d ( s1 , x ) )

(11)

swap III

∗∗ F a l l u n t e r s c h e i d u n g ∗∗

1 ) r e a d ( s1 , y ) != r e a d ( s1 , x ) :

Dann : r e a d ( s3 , r e a d ( s1 , x ) ) = r e a d ( s2 , r e a d ( s1 , x ) ) A l s o : r e a d ( s2 , r e a d ( s1 , x ) ) = r e a d ( s1 , r e a d ( s1 , y ) F o l g t :

= { l e t s 1=Upd ( s , z , r e a d ( s , r e a d ( s , x ) ) ) ;

l e t s 2=Upd ( s1 , r e a d ( s1 , x ) , r e a d ( s1 , r e a d ( s1 , y ) ) ; l e t s 3=Upd ( s2 , r e a d ( s2 , y ) , r e a d ( s2 , z ) ) ;

i n \o l d(∗x ) == r e a d ( s , r e a d ( s , x ) ) && \o l d(∗y ) == r e a d ( s1 , r e a d ( s1 , y ) ) } Da a u s s e r d e m : r e a d ( s1 , y ) != ( l o k a l e V a r i a b l e s i n d von a u s s e n n i c h t s i c h t b a r )

F o l g t :

= { l e t s 1=Upd ( s , z , r e a d ( s , r e a d ( s , x ) ) ) ;

l e t s 2=Upd ( s1 , r e a d ( s1 , x ) , r e a d ( s1 , r e a d ( s1 , y ) ) ; l e t s 3=Upd ( s2 , r e a d ( s2 , y ) , r e a d ( s2 , z ) ) ;

i n \o l d(∗x ) == r e a d ( s , r e a d ( s , x ) ) && \o l d(∗y ) == r e a d ( s , r e a d ( s , y ) ) } 2 ) r e a d ( s1 , y ) == r e a d ( s1 , x ) :

Dann war a u c h : r e a d ( s , y ) == r e a d ( s , x ) :

Dann : r e a d ( s2 , r e a d ( s2 , y ) ) = r e a d ( s1 , r e a d ( s1 , y ) Dann : r e a d ( s3 , r e a d ( s1 , x ) ) = r e a d ( s2 , z )

= r e a d ( s , r e a d ( s , x ) )

= r e a d ( s , r e a d ( s , y ) ) F o l g t ( a u c h w i e i n 1 )

= { l e t s 1=Upd ( s , z , r e a d ( s , r e a d ( s , x ) ) ) ;

l e t s 2=Upd ( s1 , r e a d ( s1 , x ) , r e a d ( s1 , r e a d ( s1 , y ) ) ) ; l e t s 3=Upd ( s2 , r e a d ( s2 , y ) , r e a d ( s2 , z ) ) ;

i n \o l d(∗x ) == r e a d ( s , r e a d ( s , x ) ) && \o l d(∗y ) == r e a d ( s , r e a d ( s , y ) ) }

∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗

(B) wvc ( G , swap ) =

(12)

swap IV

{ P# ==> awp (G , z =∗x ; ∗x =∗y ; ∗y = z , Q#, Q#)[ e _ i /\o l d( e _ i ) ] } U wvc (G , z =∗x ; ∗x =∗y ; ∗y = z , Q#, Q#)

= { P# ==> ( \o l d(∗x ) == r e a d ( s , r e a d ( s , x ) ) && \o l d(∗y ) == r e a d ( s , r e a d ( s , y ) ) ) [ r e a d ( s , r e a d ( s , x ) ) / \o l d(∗x ) , r e a d ( s , r e a d ( s , y ) ) / \o l d(∗y ) ] } U wvc (G , z =∗x ; ∗x =∗y ; ∗y = z , Q#, Q#)

= { P# ==> ( r e a d ( s , r e a d ( s , x ) ) == r e a d ( s , r e a d ( s , x ) ) &&

r e a d ( s , r e a d ( s , y ) ) == r e a d ( s , r e a d ( s , y ) ) ) } U wvc (G , z =∗x ; ∗x =∗y ; ∗y = z , Q#, Q#)

= { True } U wvc (G , z =∗x ; ∗x = ∗y ; ∗y = z , Q#, Q#) ( Aus B . 2 f o l g t )

= { True }

(B . 1 ) P# = ( \ v a l i d (∗x ) && \ v a l i d (∗y ))#

= \ v a l i d ( r e a d ( s , r e a d ( s , x ) ) ) && \ v a l i d ( r e a d ( s , r e a d ( s , y ) ) ) (B . 2 ) wvc (G , z =∗x ; ∗x = ∗y ; ∗y = z , Q#, Q#)

= wvc ( G , z =∗x , awp ( G , ∗x =∗y ; ∗y = z , Q#, Q#)) U wvc (G , ∗x =∗y , awp ( G , ∗y = z , Q#, Q#)) U wvc (G , ∗y = z , awp (G , { } , Q#, Q#)) U wvc (G , { } , Q#, Q#)

= wvc ( G , z =∗x , awp ( G , ∗x =∗y ; ∗y = z , Q#, Q#)) [ A . 2 ] U wvc (G , ∗x =∗y , awp ( G , ∗y = z , Q#, Q#)) [ A . 1 ] U wvc (G , ∗y = z , Q#)

U {}

Durch (A . 1 ) , (A . 2 )

= wvc ( G , z =∗x , Q2 ) U wvc (G , ∗x =∗y , Q1 ) U wvc (G , ∗y = z , Q#)

= {}

(13)

Beispiel: findmax revisited

#i n c l u d e < l i m i t s . h>

i n t f i n d m a x ( i n t a [ ] , i n t a _ l e n ) / ∗ ∗ p r e \ a r r a y ( a , a _ l e n ) ; ∗ /

/ ∗ ∗ p o s t \ f o r a l l i n t i ; 0 <= i && i < a _ l e n

−− > a [ i ] <= \ r e s u l t ; ∗/

{

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 \ f o r a l l i n t i ; 0 <= i && i < j −− > a [ i ]<= x && j <= 1 0 ; ∗/

{

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

}

r e t u r n x ;

}

(14)

Fazit

I Der Hoare-Kalkül ist viel Schreibarbeitet

I Deshalb haben wir Verifikationsbedingungen berechnet:

I

Approximative schwächste Vorbedingung

I Als nächstes: Approximative stärkste Nachbedingung

Referenzen

ÄHNLICHE DOKUMENTE

I Vorherige Modellierung — Zuweisung durch Substitution modelliert — nicht mehr ausreichend?. I Daher:

I Felder als Parameter werden Zeigern konvertiert, deshalb müssen wir spezifizieren können, dass ein Zeiger “in Wirklichkeit” ein Feld ist. I \array(a, n) bedeutet: a ist ein Feld

I Wir annotieren daher die Invarianten an Schleifen, und können dann die schwächste Vorbedingung und Verifikationsbedingungen.

I Die Regeln des Floyd-Hoare-Kalküls lassen sich, weitgehend schematisch, rückwärts (vom Ende her) anwenden — nur Schleifen machen Probleme?. I Wir annotieren daher die Invarianten

I Felder als Parameter werden Zeigern konvertiert, deshalb müssen wir spezifizieren können, dass ein Zeiger “in Wirklichkeit” ein Feld ist. I \array(a, n) bedeutet: a ist ein Feld

Korrekte Software: Grundlagen und Methoden Vorlesung 10 vom 12.06.17: Verifikationsbedingungen Revisited. Serge Autexier, Christoph Lüth Universität Bremen

[r]

I Felder als Parameter werden Zeigern konvertiert, deshalb müssen wir spezifizieren können, dass ein Zeiger “in Wirklichkeit” ein Feld ist. I