27
An introduction to separation logic James Brotherston Programming Principles, Logic and Verification Group Dept. of Computer Science University College London, UK [email protected] Oracle Labs, Brisbane, 4 December 2015 1/ 19

An introduction to separation logic · An introduction to separation logic James Brotherston Programming Principles, Logic and Veri cation Group Dept. of Computer Science University

  • Upload
    others

  • View
    6

  • Download
    0

Embed Size (px)

Citation preview

Page 1: An introduction to separation logic · An introduction to separation logic James Brotherston Programming Principles, Logic and Veri cation Group Dept. of Computer Science University

An introduction to separation logic

James Brotherston

Programming Principles, Logic and Verification GroupDept. of Computer Science

University College London, [email protected]

Oracle Labs, Brisbane, 4 December 2015

1/ 19

Page 2: An introduction to separation logic · An introduction to separation logic James Brotherston Programming Principles, Logic and Veri cation Group Dept. of Computer Science University

Introduction

Verification of imperative programs is classically based onHoare triples:

{P}C {Q}

where C is a program and P,Q are assertions in some logicallanguage.

These are read, roughly speaking, as

for any state σ satisfying P , if C transforms state σ toσ′, then σ′ satisfies Q.

(with some wriggle room allowing us to deal with faulting ornon-termination in various ways.)

2/ 19

Page 3: An introduction to separation logic · An introduction to separation logic James Brotherston Programming Principles, Logic and Veri cation Group Dept. of Computer Science University

Hoare-style verification

A Hoare-style program logic therefore relies on three maincomponents:

1. a language of programs, and an operational semanticsexplaining how they transform states;

2. a language of logical assertions, and a semantics explaininghow to read them as true or false in a particular state;

3. a formal interpretation of Hoare triples, together with(sound) proof rules for manipulating them.

We’ll look at these informally first, then introduce a little moreformal detail.

3/ 19

Page 4: An introduction to separation logic · An introduction to separation logic James Brotherston Programming Principles, Logic and Veri cation Group Dept. of Computer Science University

Programs, informally

We consider a standard while language with pointers, memory(de)allocation and recursive procedures. E.g.:

deltree(*x) {if x=nil then return;

else {l,r := x.left,x.right;

deltree(l);

deltree(r);

free(x);

}}

4/ 19

Page 5: An introduction to separation logic · An introduction to separation logic James Brotherston Programming Principles, Logic and Veri cation Group Dept. of Computer Science University

Assertions, informally

Our assertion language lets us describe heap data structuressuch as linked lists and trees.

E.g., binary trees with root pointer x can be defined by:

x = nil : emp ⇒ tree(x)x 6= nil : x 7→ (y, z) ∗ tree(y) ∗ tree(z) ⇒ tree(x)

where

• emp denotes the empty heap;

• x 7→ (y, z) denotes a single pointer to a pair of data cells;

• ∗ means “and separately in memory”.

5/ 19

Page 6: An introduction to separation logic · An introduction to separation logic James Brotherston Programming Principles, Logic and Veri cation Group Dept. of Computer Science University

An example proof

{tree(x)}

deltree(*x) {if x=nil then return;

{emp}

else {

{x 7→ (y, z) ∗ tree(y) ∗ tree(z)}

l,r := x.left,x.right;

{x 7→ (l, r) ∗ tree(l) ∗ tree(r)}

deltree(l);

{x 7→ (l, r) ∗ emp ∗ tree(r)}

deltree(r);

{x 7→ (l, r) ∗ emp ∗ emp}

free(x);

{emp ∗ emp ∗ emp}

}

{emp}

}

{emp}

6/ 19

Page 7: An introduction to separation logic · An introduction to separation logic James Brotherston Programming Principles, Logic and Veri cation Group Dept. of Computer Science University

An example proof

{tree(x)}deltree(*x) {

if x=nil then return;

{emp}

else {

{x 7→ (y, z) ∗ tree(y) ∗ tree(z)}

l,r := x.left,x.right;

{x 7→ (l, r) ∗ tree(l) ∗ tree(r)}

deltree(l);

{x 7→ (l, r) ∗ emp ∗ tree(r)}

deltree(r);

{x 7→ (l, r) ∗ emp ∗ emp}

free(x);

{emp ∗ emp ∗ emp}

}

{emp}

} {emp}6/ 19

Page 8: An introduction to separation logic · An introduction to separation logic James Brotherston Programming Principles, Logic and Veri cation Group Dept. of Computer Science University

An example proof

{tree(x)}deltree(*x) {

if x=nil then return; {emp}else {

{x 7→ (y, z) ∗ tree(y) ∗ tree(z)}

l,r := x.left,x.right;

{x 7→ (l, r) ∗ tree(l) ∗ tree(r)}

deltree(l);

{x 7→ (l, r) ∗ emp ∗ tree(r)}

deltree(r);

{x 7→ (l, r) ∗ emp ∗ emp}

free(x);

{emp ∗ emp ∗ emp}

}

{emp}

} {emp}6/ 19

Page 9: An introduction to separation logic · An introduction to separation logic James Brotherston Programming Principles, Logic and Veri cation Group Dept. of Computer Science University

An example proof

{tree(x)}deltree(*x) {

if x=nil then return; {emp}else { {x 7→ (y, z) ∗ tree(y) ∗ tree(z)}

l,r := x.left,x.right;

{x 7→ (l, r) ∗ tree(l) ∗ tree(r)}

deltree(l);

{x 7→ (l, r) ∗ emp ∗ tree(r)}

deltree(r);

{x 7→ (l, r) ∗ emp ∗ emp}

free(x);

{emp ∗ emp ∗ emp}

}

{emp}

} {emp}6/ 19

Page 10: An introduction to separation logic · An introduction to separation logic James Brotherston Programming Principles, Logic and Veri cation Group Dept. of Computer Science University

An example proof

{tree(x)}deltree(*x) {

if x=nil then return; {emp}else { {x 7→ (y, z) ∗ tree(y) ∗ tree(z)}

l,r := x.left,x.right;

{x 7→ (l, r) ∗ tree(l) ∗ tree(r)}deltree(l);

{x 7→ (l, r) ∗ emp ∗ tree(r)}

deltree(r);

{x 7→ (l, r) ∗ emp ∗ emp}

free(x);

{emp ∗ emp ∗ emp}

}

{emp}

} {emp}6/ 19

Page 11: An introduction to separation logic · An introduction to separation logic James Brotherston Programming Principles, Logic and Veri cation Group Dept. of Computer Science University

An example proof

{tree(x)}deltree(*x) {

if x=nil then return; {emp}else { {x 7→ (y, z) ∗ tree(y) ∗ tree(z)}

l,r := x.left,x.right;

{x 7→ (l, r) ∗ tree(l) ∗ tree(r)}deltree(l);

{x 7→ (l, r) ∗ emp ∗ tree(r)}deltree(r);

{x 7→ (l, r) ∗ emp ∗ emp}

free(x);

{emp ∗ emp ∗ emp}

}

{emp}

} {emp}6/ 19

Page 12: An introduction to separation logic · An introduction to separation logic James Brotherston Programming Principles, Logic and Veri cation Group Dept. of Computer Science University

An example proof

{tree(x)}deltree(*x) {

if x=nil then return; {emp}else { {x 7→ (y, z) ∗ tree(y) ∗ tree(z)}

l,r := x.left,x.right;

{x 7→ (l, r) ∗ tree(l) ∗ tree(r)}deltree(l);

{x 7→ (l, r) ∗ emp ∗ tree(r)}deltree(r);

{x 7→ (l, r) ∗ emp ∗ emp}free(x);

{emp ∗ emp ∗ emp}

}

{emp}

} {emp}6/ 19

Page 13: An introduction to separation logic · An introduction to separation logic James Brotherston Programming Principles, Logic and Veri cation Group Dept. of Computer Science University

An example proof

{tree(x)}deltree(*x) {

if x=nil then return; {emp}else { {x 7→ (y, z) ∗ tree(y) ∗ tree(z)}

l,r := x.left,x.right;

{x 7→ (l, r) ∗ tree(l) ∗ tree(r)}deltree(l);

{x 7→ (l, r) ∗ emp ∗ tree(r)}deltree(r);

{x 7→ (l, r) ∗ emp ∗ emp}free(x);

{emp ∗ emp ∗ emp}}

{emp}

} {emp}6/ 19

Page 14: An introduction to separation logic · An introduction to separation logic James Brotherston Programming Principles, Logic and Veri cation Group Dept. of Computer Science University

An example proof

{tree(x)}deltree(*x) {

if x=nil then return; {emp}else { {x 7→ (y, z) ∗ tree(y) ∗ tree(z)}

l,r := x.left,x.right;

{x 7→ (l, r) ∗ tree(l) ∗ tree(r)}deltree(l);

{x 7→ (l, r) ∗ emp ∗ tree(r)}deltree(r);

{x 7→ (l, r) ∗ emp ∗ emp}free(x);

{emp ∗ emp ∗ emp}} {emp}

} {emp}6/ 19

Page 15: An introduction to separation logic · An introduction to separation logic James Brotherston Programming Principles, Logic and Veri cation Group Dept. of Computer Science University

Frame property

Consider the following step in the previous example:

{x 7→ (l, r) ∗ tree(l) ∗ tree(r)}deltree(l)

{x 7→ (l, r) ∗ emp ∗ tree(r)}

Implicitly, this relies on a framing property, namely:

{tree(l)} deltree(l) {emp}

{x 7→ (l, r) ∗ tree(l) ∗ tree(r)} deltree(l) {x 7→ (l, r) ∗ emp ∗ tree(r)}

7/ 19

Page 16: An introduction to separation logic · An introduction to separation logic James Brotherston Programming Principles, Logic and Veri cation Group Dept. of Computer Science University

Classical failure of frame rule

The so-called frame rule,

{P}C {Q}

{F ∧ P}C {F ∧Q}

is well known to fail in standard Hoare logic. E.g.,

{x = 0}x := 2 {x = 2}

{y = 0 ∧ x = 0}x := 2 {y = 0 ∧ x = 2}

is not valid (because y could alias x).

As we’ll see, using the “separating conjunction” ∗ instead of ∧will however give us a valid frame rule.

8/ 19

Page 17: An introduction to separation logic · An introduction to separation logic James Brotherston Programming Principles, Logic and Veri cation Group Dept. of Computer Science University

Heap memory model

• We assume an infinite set Val of values of which an infinitesubset Loc ⊂ Val are allocable locations; nil is anon-allocable value.

• Stacks map variables to values, s : Var→ Val.

• Heaps map finitely many locations to values,h : Loc⇀fin Val. We write e for the empty heap (undefinedon all locations).

• Heap composition h1 ◦ h2 is defined to be h1 ∪ h2 if theirdomains are non-overlapping, and undefined otherwise.

• A state is simply a stack paired with a heap, (s, h).

9/ 19

Page 18: An introduction to separation logic · An introduction to separation logic James Brotherston Programming Principles, Logic and Veri cation Group Dept. of Computer Science University

Program semantics

• A configuration is given by (C, s, h), where C is a program,and (s, h) a (stack-heap) state.

• C could be empty, in which case we call (C, s, h) final (andusually just write 〈s, h〉).

• fault is a special configuration used to catch memory errors.

• The small-step semantics of programs is then given by arelation between configurations:

(C, s, h) (C ′, s′, h′)

10/ 19

Page 19: An introduction to separation logic · An introduction to separation logic James Brotherston Programming Principles, Logic and Veri cation Group Dept. of Computer Science University

Semantics of assignment and (de)allocation

(x := E, s, h) (s[x 7→ [[E]]s], h)

[[E]]s ∈ dom(h)

(x := E.f, s, h) (s[x 7→ h([[E]]s).f ], h)

[[E]]s ∈ dom(h)

(E.f := E′, s, h) (s, h[[[E]]s.f 7→ [[E′]]s])

` ∈ Loc \ dom(h) v ∈ Val

(E := new(), s, h) (s[x 7→ `], h[` 7→ v])

[[E]]s = ` ∈ dom(h)

(free(E), s, h) (s, (h � (dom(h) \ {`}))

C ≡ x := E.f | E.f := E′ | free(E) [[E]]s /∈ dom(h)

(C, s, h) fault

11/ 19

Page 20: An introduction to separation logic · An introduction to separation logic James Brotherston Programming Principles, Logic and Veri cation Group Dept. of Computer Science University

Symbolic-heap assertions

• Terms t are either variables x, y, z . . . or the constant nil.

• Pure formulas π and spatial formulas F are given by:

π ::= t = t | t 6= tF ::= emp | x 7→ t | P t | F ∗ F

(where P a predicate symbol, t a tuple of terms).

• A symbolic heap is ∃x. Π : F , for Π a set of pure formulas.

• The predicate symbols might come from a hard-coded set,or might be user-defined.

12/ 19

Page 21: An introduction to separation logic · An introduction to separation logic James Brotherston Programming Principles, Logic and Veri cation Group Dept. of Computer Science University

Semantics of assertions

We define the forcing relation s, h |= A:

s, h |=Φ t1 = ( 6=)t2 ⇔ s(t1) = (6=)s(t2)

s, h |=Φ emp ⇔ h = e

s, h |=Φ x 7→ t ⇔ dom(h) = {s(x)} and h(s(x)) = s(t)

s, h |=Φ P t ⇔ (s(t), h) ∈ [[P ]]

s, h |=Φ F1 ∗ F2 ⇔ ∃h1, h2. h = h1 ◦ h2 and s, h1 |=Φ F1

and s, h2 |=Φ F2

s, h |=Φ ∃z. Π : F ⇔ ∃v ∈ Val|z|. s[z 7→ v], h |=Φ π for all

π ∈ Π and s[z 7→ v], h |=Φ F

The semantics [[P ]] of inductive predicate P has a standardconstruction (but outside the scope of this talk).

13/ 19

Page 22: An introduction to separation logic · An introduction to separation logic James Brotherston Programming Principles, Logic and Veri cation Group Dept. of Computer Science University

Interpretation of Hoare triples

Our interpretation of Hoare triples is almost standard, exceptwe take a fault-avoiding interpretation:

Definition

{P}C {Q} is valid if, whenever s, h |= P ,

1. (C, s, h) 6 ∗ fault (i.e. is memory-safe), and

2. if (C, s, h) ∗ (ε, s, h), then s, h |= Q.

If we are interested in total correctness, simply replace thememory-safety condition above by (safe) termination:everything still works!

14/ 19

Page 23: An introduction to separation logic · An introduction to separation logic James Brotherston Programming Principles, Logic and Veri cation Group Dept. of Computer Science University

Axioms and proof rules for triples

{emp}x := E {x = E[x′/x] : emp} {E.f 7→ }E.f := E′ {E.f 7→ E′}

{E.f 7→ t}x := E.f {x = t[x′/x] : E.f 7→ t[x′/x]}

{emp}x := new() {x 7→ x′} {E 7→ } free(E) {emp}

{P}C1 {R} {R}C2 {Q}

{P}C1;C2 {Q}

{B : P}C1 {Q} {¬B : P}C2 {Q}

{P} if B then C1 else C2 {Q}

(Note that E.f 7→ E′ is a shorthand for E 7→ (. . . , E′, . . .)where E′ occurs at the fth position in the tuple.)

15/ 19

Page 24: An introduction to separation logic · An introduction to separation logic James Brotherston Programming Principles, Logic and Veri cation Group Dept. of Computer Science University

The frame rule

The general frame rule of separation logic can be stated asfollows:

{P}C {Q}

{F ∗ P}C {F ∗Q}

subject to the obvious sanity condition: C does not modify anyvariable mentioned in the “frame” F .

This rule is exactly what is needed to carry out proofs like theone we saw before for deltree.

16/ 19

Page 25: An introduction to separation logic · An introduction to separation logic James Brotherston Programming Principles, Logic and Veri cation Group Dept. of Computer Science University

Soundness of frame rule

Soundness of the frame rule depends on the following two factsabout the programming language:

Lemma (Safety monotonicity)

If (C, s, h) 6 ∗ fault then (C, s, h ◦ h′) 6 ∗ fault (for any h′ suchthat h ◦ h′ is defined).

Lemma (Frame property)

Suppose (C, s, h1 ◦ h2) ∗ 〈s, h〉, and that (C, s, h1) 6 ∗ fault.Then there exists h′ such that (C, s, h1) ∗ 〈s, h′〉, and,moreover, h = h′ ◦ h2.

Together, these lemmas imply the locality of all commands.N.B.: this is an operational fact about the programminglanguage, and nothing at all to do with logic!

17/ 19

Page 26: An introduction to separation logic · An introduction to separation logic James Brotherston Programming Principles, Logic and Veri cation Group Dept. of Computer Science University

Closing remarks

• What we call separation logic is really a combination of• programming language,• assertion language• and rules for Hoare triples.

• The power of separation logic comes from compositionality:proofs of sub-programs can be combined into proofs ofwhole programs.

• Compositionality depends on the frame rule:

{P}C {Q}

{F ∗ P}C {F ∗Q}

• And the soundness of the frame rule is essentially areflection of the locality of commands.

18/ 19

Page 27: An introduction to separation logic · An introduction to separation logic James Brotherston Programming Principles, Logic and Veri cation Group Dept. of Computer Science University

Further reading

S. Ishtiaq and P. O’Hearn.BI as an assertion language for mutable data structures.In Proc. POPL-28. ACM, 2001.(Winner of Most Influential POPL Paper 2001 award.)

J.C. Reynolds.Separation logic: A logic for shared mutable data structures.In Proc. LICS-17. IEEE, 2002.

H. Yang and P. O’Hearn.A semantic basis for local reasoning.In Proc. FoSSaCS-5. Springer. 2002.

C. Calcagno, D. Distefano, P. O’Hearn and H. Yang.Compositional shape analysis by means of bi-abduction.In Journal of the ACM 58(6). ACM, 2011.Original version in Proc. POPL-36. ACM, 2009.

19/ 19