Spring 2015 Program Analysis and Verification Lecture 4: Axiomatic Semantics I Roman Manevich Ben-Gurion University Agenda • Basic concepts of correctness • Axiomatic semantics (pages 175-183) – Hoare Logic – Properties of the semantics – Weakest precondition 2 Tentative syllabus Semantics Static Analysis Abstract Interpretation fundamentals Analysis Techniques Crafting your own Natural Semantics Automating Hoare Logic Lattices Numerical Domains Soot Structural semantics Control Flow Graphs Fixed-Points Alias analysis From proofs to abstractions Axiomatic Verification Equation Systems Chaotic Iteration Interprocedural Analysis Systematically developing transformers Collecting Semantics Galois Connections Shape Analysis Domain constructors CEGAR Widening/ Narrowing 3 program correctness 4 Program correctness concepts • Property = a certain relationship between initial state and final state Main focus of this course • Partial correctness = properties that hold if program terminates • Termination = program always terminates – i.e., for every input state partial correctness + termination = total correctness Other correctness concepts exist: liveness, resource usage, … 5 Factorial example Sfac y := 1; while (x=1) do (y := y*x; x := x–1) • Factorial partial correctness property = if the statement terminates then the final value of y will be the factorial of the initial value of x – What if x < 0? • Formally, using natural semantics: …? Sfac , ’ implies ’ y = ( x)! 6 Verifying factorial with natural semantics 7 Natural semantics for While [assns] [skipns] x := a, [x Aa] skip, S1, ’, S2, ’ ’’ [compns] S1; S2, ’’ [ifttns] S1, ’ if b then S1 else S2, [ifffns] S2, ’ if b then S1 else S2, ’ if B b = tt ’ [whileffns] while b do S, [whilettns] S, ’, while b do S, ’ while b do S, ’’ if B b = ff if B b = ff ’’ if B b = tt 8 Staged proof 9 Stages sy s sy (s x)! = s’’ y s (s’’ x)! (s x)! = s’’ y sx>0 y := y*x; x := x–1 s’’x = 1 s’’ sx>0 while (x=1) do (y := y*x; x := x–1) s’ y = (s x)! s (s’’ x)! s’’ sx>0 y := 1; while (x=1) do (y := y*x; x := x–1) s’ 10 Inductive proof over iterations sy (s x)! = s’ y (s’ x)! sx>0 s (y := y*x; x := x–1) s’ s’ while (x=1) do (y := y*x; x := x–1) s’’ s’ y s s’’x = 1 s’ x > 0 while (x=1) do (y := y*x; x := x–1) s’’ sy (s x)! = s’’ y (s’ x)! = s’’ y (s’’ x)! s’’x = 1 (s’’ x)! sx>0 11 First stage 12 Second stage 13 while (x=1) do (y := y*x; x := x–1), s s’ 14 Third stage 15 How easy was that? • Proof is very laborious – Need to connect all transitions and argue about relationships between their states – Reason: too closely connected to semantics of programming language • Proof is long – Makes it hard to find possible mistakes • How did we know to find this proof? – Is there a methodology? 16 I’ll use operational semantics Can you prove my program correct? Better use axiomatic verification 17 One of the oldest surviving fragments of Euclid's Elements, a textbook used for millennia to teach proof-writing techniques. The diagram accompanies Book II, Proposition 5 "P. Oxy. I 29" by Euclid - http://www.math.ubc.ca/~cass/Euclid/papyrus/tha.jpg. Licensed under Public Domain via Wikimedia Commons http://commons.wikimedia.org/wiki/File:P._Oxy._I_29.jpg#/media/File:P._Oxy._I_29.jpg 18 A systematic approach to program verification 19 Axiomatic verification approach • What do we need in order to prove that the program does what it supposed to do? • Specify the required behavior: express properties • Compare the behavior with the one obtained by the operational semantics • Develop a proof system for showing that the program satisfies a requirement • Mechanically use the proof system to show correctness 20 Axiomatic semantics contributors Robert Floyd 1967: use assertions as foundation for static correctness proofs C.A.R. Hoare 1969: use Floyd’s ideas to define axiomatic semantics “An axiomatic basis for computer programming” Edsger W. Dijkstra Predicate transformer semantics: weakest precondition and strongest postcondition 21 Assertions, a.k.a Hoare triples {P}C{Q} precondition statement a.k.a command postcondition • P and Q are state predicates expressed as logical formulas – Example: x>0 • If P holds in the initial state, and if execution of C terminates on that state, then Q will hold in the state in which C halts • C is not required to always terminate {true} while true do skip {false} 22 Total correctness assertions [P]C[Q] • If P holds in the initial state, execution of C must terminate on that state, and Q will hold in the state in which C halts 23 Specifying correctness of factorial 24 Factorial example: specify precondition/postcondition {?} y := 1; while (x=1) do (y := y*x; x := x–1) {?} 25 First attempt We need a way to “remember” value of x before execution { x>0 } y := 1; while (x=1) do (y := y*x; x := x–1) { y=x! } Holds only for value of x at state after execution finishes 26 Fixed assertion A logical variable, must not appear in statement - immutable { x=n } y := 1; while (x=1) do (y := y*x; x := x–1) { y=n! n>0 } 27 The proof outline { n!*(n+1) = (n+1)! } Background axiom { x=n } y := 1; { x>0 y*x!=n! n x } while (x=1) do { x-1>0 (y*x)*(x-1)!=n! n (x-1) } y := y*x; { x-1>0 y*(x-1)!=n! n (x-1) } x := x–1 { y*x!=n! n>0 x=1 } 28 Formalizing partial correctness via hoare logic 29 States and predicates • – program states (State) – undefined • A state predicate P is a (possibly infinite) set of states • P P – P holds in state 30 FO Logic reminder • We write A B if for all states if A then B – { | A } { | B } – For every predicate A: false • We write A – false B if A A B and B true A 5=7 • In writing Hoare-style proofs, we will often replace a predicate A with A’ such that A A’ and A’ is “simpler” 31 Formalizing Hoare triples Sns C = ’ if C, else Q ’ P C(P) C ’ • {P}C{Q} . ( P C, ’) alternatively – Convention: P for all P . P Sns C Q – , ’ ’ Q Why did we choose natural semantics? 32 Formalizing Hoare triples Ssos C = ’ if C, * ’ else Q P C(P) C ’ • {P}C{Q} . ( P C, *’) alternatively – Convention: P for all P . P Ssos C Q – , ’ ’ Q 33 How do we express predicates? • Extensional approach – Abstract mathematical functions P : State {tt, ff} • Intensional approach – via language of formulae 34 An assertion language • Bexp is not expressive enough to express predicates needed for many proofs – Extend Bexp • Allow quantification – z. … – z. … • z. z = kn • Import well known mathematical concepts – n! n (n-1) 2 1 35 An assertion language Either a program variables or a logical variable a ::= n | x | a1 + a2 | a1 a2 | a1 – a2 A ::= true | false | a1 = a2 | a1 a2 | A | A1 A2 | A1 | A1 A2 | z. A | z. A A2 36 Some FO logic definitions before we get to the rules 37 Free/bound variables • A variable is said to be bound in a formula when it occurs in the scope of a quantifier Otherwise it is said to be free – i. k=im – (i+10077)i. j+1=i+3) • FV(A) the free variables of A • Defined inductively on the abstract syntax tree of A 38 Computing free variables FV(n) {} FV(x) {x} FV(a1+a2) FV(a1 a2) FV(a1-a2) FV(a1) FV(a2) FV(true) FV(false) {} FV(a1=a2) FV(a1 a2) FV(a1) FV(a2) FV( A) FV(A) FV(A1 A2) FV(A1 A2) FV(A1 A2) FV(a1) FV(a2) FV( z. A) FV( z. A) FV(A) \ {z} 39 Substitution • An expression t is pure (a term) if it does not contain quantifiers • A[t/z] denotes the assertion A’ which is the same as A, except that all instances of the free variable z are replaced by t • A i. k=i m A[5/k] = …? A[5/i] = …? 40 Calculating substitutions n[t/z] = n x[t/z] = x x[t/x] = t (a1 + a2)[t/z] = a1[t/z] + a2[t/z] (a1 a2)[t/z] = a1[t/z] a2[t/z] (a1 - a2)[t/z] = a1[t/z] - a2[t/z] 41 Calculating substitutions true[t/x] = true false[t/x] = false (a1 = a2)[t/z] = a1[t/z] = a2[t/z] (a1 a2)[t/z] = a1[t/z] a2[t/z] ( A)[t/z] = (A[t/z]) (A1 A2)[t/z] = A1[t/z] A2[t/z] (A1 A2)[t/z] = A1[t/z] A2[t/z] (A1 A2)[t/z] = A1[t/z] A2[t/z] ( ( ( ( z. A)[t/z] = z. A z. A)[t/y] = z. A[t/y] z. A)[t/z] = z. A z. A)[t/y] = z. A[t/y] 42 six are completely enough and now… the rules 43 Axiomatic semantics for While [assp] { P[a/x] } x := a { P } Notice similarity to natural semantics rules [skipp] { P } skip { P } { P } S1 { Q }, { Q } S2 { R } [compp] { P } S1; S2 { R } {b P } S1 { Q }, { b P } S2 { Q } [ifp] { P } if b then S1 else S2 { Q } What’s different about this rule? [whilep] [consp] {b P}S{P} { P } while b do S { b { P’ } S { Q’ } {P}S{Q} P} if P P’ and Q’ Q 44 Assignment rule [assp] { P[a/x] } x := a { P } • A “backwards” rule • x := a always finishes • Why is this true? [x Aa] P – Recall operational semantics: [assns] x:= a, [x Aa] • Exercises: {?} x:=y*z {x<9} {?} x:=x+1 {x>8} {?} x:=y*z {w=5} 45 skip rule [skipp] { P } skip { P } [skipns] skip, 46 Composition rule { P } S1 { Q }, { Q } S2 { R } [compp] { P } S1; S2 { R } S1, ’, S2, ’ ’’ [compns] S1; S2, ’’ • Holds when S1 terminates in every state where P holds and then Q holds and S2 terminates in every state where Q holds and then R holds 47 Condition rule { b P } S1 { Q }, { b P } S2 { Q } [ifp] { P } if b then S1 else S2 { Q } [ifttns] S1, ’ if b then S1 else S2, [ifffns] S2, ’ if b then S1 else S2, ’ ’ if B if B b = tt b = ff 48 Loop rule {b P}S{P} [whilep] { P } while b do S { b } [whileffns] while b do S, [whilettns] S, ’, while b do S, ’ while b do S, ’’ if B ’’ if B P b = ff b = tt • Here P is called an invariant for the loop – Holds before and after each loop iteration – Finding loop invariants – most challenging part of proofs • When loop finishes, b is false 49 Rule of consequence { P’ } S { Q’ } [consp] {P}S{Q} if P P’ and Q’ Q • Allows strengthening the precondition and weakening the postcondition • The only rule that is not related to a statement 50 Rule of consequence { P’ } S { Q’ } [consp] {P}S{Q} if P P’ and Q’ Q • Why do we need it? • Allows the following {y*z<9} x:=y*z {x<9} {y*z<9 w=5} x:=y*z {x<9} 51 Next lecture: axiomatic semantics II