1 Lecture 08(c) – Predicate Abstraction and SLAM Eran Yahav.

Slides:



Advertisements
Similar presentations
Model Checking Lecture 4. Outline 1 Specifications: logic vs. automata, linear vs. branching, safety vs. liveness 2 Graph algorithms for model checking.
Advertisements

Advanced programming tools at Microsoft
Automated Theorem Proving Lecture 1. Program verification is undecidable! Given program P and specification S, does P satisfy S?
Synthesis, Analysis, and Verification Lecture 04c Lectures: Viktor Kuncak VC Generation for Programs with Data Structures “Beyond Integers”
Abstraction of Source Code (from Bandera lectures and talks)
Predicate Abstraction and Canonical Abstraction for Singly - linked Lists Roman Manevich Mooly Sagiv Tel Aviv University Eran Yahav G. Ramalingam IBM T.J.
Shape Analysis by Graph Decomposition R. Manevich M. Sagiv Tel Aviv University G. Ramalingam MSR India J. Berdine B. Cook MSR Cambridge.
Context-Sensitive Interprocedural Points-to Analysis in the Presence of Function Pointers Presentation by Patrick Kaleem Justin.
Hoare’s Correctness Triplets Dijkstra’s Predicate Transformers
Bebop: A Symbolic Model Checker for Boolean Programs Thomas Ball Sriram K. Rajamani
Rigorous Software Development CSCI-GA Instructor: Thomas Wies Spring 2012 Lecture 13.
A survey of techniques for precise program slicing Komondoor V. Raghavan Indian Institute of Science, Bangalore.
Chair of Software Engineering Software Verification Stephan van Staden Lecture 10: Model Checking.
Automatic Predicate Abstraction of C-Programs T. Ball, R. Majumdar T. Millstein, S. Rajamani.
1 Automatic Predicate Abstraction of C Programs Parts of the slides are from
Verification of parameterised systems
Symmetry-Aware Predicate Abstraction for Shared-Variable Concurrent Programs Alastair Donaldson, Alexander Kaiser, Daniel Kroening, and Thomas Wahl Computer.
The Software Model Checker BLAST by Dirk Beyer, Thomas A. Henzinger, Ranjit Jhala and Rupak Majumdar Presented by Yunho Kim Provable Software Lab, KAIST.
Software Verification via Refinement Checking Sagar Chaki, Edmund Clarke, Alex Groce, CMU Somesh Jha, Wisconsin.
Weizmann Institute Deciding equality formulas by small domain instantiations O. Shtrichman The Weizmann Institute Joint work with A.Pnueli, Y.Rodeh, M.Siegel.
Using Statically Computed Invariants Inside the Predicate Abstraction and Refinement Loop Himanshu Jain Franjo Ivančić Aarti Gupta Ilya Shlyakhter Chao.
Lazy Abstraction Thomas A. Henzinger Ranjit Jhala Rupak Majumdar Grégoire Sutre UC Berkeley.
1 Operational Semantics Mooly Sagiv Tel Aviv University Textbook: Semantics with Applications.
Establishing Local Temporal Heap Safety Properties with Applications to Compile-Time Memory Management Ran Shaham Eran Yahav Elliot Kolodner Mooly Sagiv.
Secrets of Software Model Checking Thomas Ball Sriram K. Rajamani Software Productivity Tools Microsoft Research
CS 267: Automated Verification Lectures 14: Predicate Abstraction, Counter- Example Guided Abstraction Refinement, Abstract Interpretation Instructor:
Automatically Validating Temporal Safety Properties of Interfaces Thomas Ball and Sriram K. Rajamani Software Productivity Tools, Microsoft Research Presented.
ESC Java. Static Analysis Spectrum Power Cost Type checking Data-flow analysis Model checking Program verification AutomatedManual ESC.
Review: forward E { P } { P && E } TF { P && ! E } { P 1 } { P 2 } { P 1 || P 2 } x = E { P } { \exists … }
Review: forward E { P } { P && E } TF { P && ! E } { P 1 } { P 2 } { P 1 || P 2 } x = E { P } { \exists … }
Invisible Invariants: Underapproximating to Overapproximate Ken McMillan Cadence Research Labs TexPoint fonts used in EMF: A A A A A.
Automatic Predicate Abstraction of C Programs Thomas BallMicrosoft Rupak MajumdarUC Berkeley Todd MillsteinU Washington Sriram K. RajamaniMicrosoft
Formal Verification of SpecC Programs using Predicate Abstraction Himanshu Jain Daniel Kroening Edmund Clarke Carnegie Mellon University.
Software Model Checking with SLAM Thomas Ball Testing, Verification and Measurement Sriram K. Rajamani Software Productivity Tools Microsoft Research
Dagstuhl Seminar "Applied Deductive Verification" November Symbolically Computing Most-Precise Abstract Operations for Shape.
By: Pashootan Vaezipoor Path Invariant Simon Fraser University – Spring 09.
1 Employing decision procedures for automatic analysis and verification of heap-manipulating programs Greta Yorsh under the supervision of Mooly Sagiv.
272: Software Engineering Fall 2012 Instructor: Tevfik Bultan Lecture 3: Modular Verification with Magic, Predicate Abstraction.
Rule Checking SLAM Checking Temporal Properties of Software with Boolean Programs Thomas Ball, Sriram K. Rajamani Microsoft Research Presented by Okan.
SAT & SMT. Software Verification & Testing SAT & SMT Test case generation Predicate Abstraction Verifying Compilers.
Newton: A tool for generating abstract explanations of infeasibility1 The Problem P (C Program) BP (Boolean Program of P) CFG(P) CFG(BP)
CS 363 Comparative Programming Languages Semantics.
Thomas Ball Sriram K. Rajamani
Predicate Abstraction of ANSI-C Programs Using SAT By Edmund Clarke, Daniel Kroening, Natalia Sharygina, Karen Yorav Presented by Yunho Kim Provable Software.
Symbolically Computing Most-Precise Abstract Operations for Shape Analysis Greta Yorsh Thomas Reps Mooly Sagiv Tel Aviv University University of Wisconsin.
Automatically Validating Temporal Safety Properties of Interfaces Thomas Ball, Sriram K. MSR Presented by Xin Li.
Convergence of Model Checking & Program Analysis Philippe Giabbanelli CMPT 894 – Spring 2008.
Symbolic Execution with Abstract Subsumption Checking Saswat Anand College of Computing, Georgia Institute of Technology Corina Păsăreanu QSS, NASA Ames.
Program Analysis and Verification Spring 2015 Program Analysis and Verification Lecture 12: Abstract Interpretation IV Roman Manevich Ben-Gurion University.
SLAM internals Sriram K. Rajamani Rigorous Software Engineering Microsoft Research, India.
Verification & Validation By: Amir Masoud Gharehbaghi
Predicate Abstraction. Abstract state space exploration Method: (1) start in the abstract initial state (2) use to compute reachable states (invariants)
Static Techniques for V&V. Hierarchy of V&V techniques Static Analysis V&V Dynamic Techniques Model Checking Simulation Symbolic Execution Testing Informal.
1 Automatically Validating Temporal Safety Properties of Interfaces - Overview of SLAM Parts of the slides are from
CS357 Lecture 13: Symbolic model checking without BDDs Alex Aiken David Dill 1.
/ PSWLAB Thread Modular Model Checking by Cormac Flanagan and Shaz Qadeer (published in Spin’03) Hong,Shin Thread Modular Model.
Roman Manevich Ben-Gurion University Program Analysis and Verification Spring 2015 Program Analysis and Verification Lecture 16: Shape Analysis.
Counter Example Guided Refinement CEGAR Mooly Sagiv.
Boolean Programs: A Model and Process For Software Analysis By Thomas Ball and Sriram K. Rajamani Microsoft technical paper MSR-TR Presented by.
Operational Semantics Mooly Sagiv Reference: Semantics with Applications Chapter 2 H. Nielson and F. Nielson
Finding bugs with a constraint solver daniel jackson. mandana vaziri mit laboratory for computer science issta 2000.
Program Analysis and Verification Spring 2015 Program Analysis and Verification Lecture 8: Static Analysis II Roman Manevich Ben-Gurion University.
Spring 2016 Program Analysis and Verification
Software Model Checking with SLAM
Symbolic Implementation of the Best Transformer
Over-Approximating Boolean Programs with Unbounded Thread Creation
Semantics In Text: Chapter 3.
Symbolic Characterization of Heap Abstractions
Predicate Abstraction
Course: CS60030 Formal Systems
Presentation transcript:

1 Lecture 08(c) – Predicate Abstraction and SLAM Eran Yahav

Previously  Typestate Verification 2

Today  Predicate Abstraction (via SLAM)  Acks  Slides cannibalized from Ball&Rajamani’s PLDI’03 Tutorial 3

Predicate Abstraction  Use formulas to observe properties in a state  e.g., (x==y),  i.a[i]= 0  Boolean abstraction  over a finite vocabulary F of predicates  abstract state is an assignment of truth values to predicates in F 4

Example 5 x=abs(?); y=x; while(x!=0) { x--; y--; } assert x==y; F = { (x==y), }(x==y-1) (x==y) = ?, (x==y-1) = ? (x==y) = T, (x==y-1) = F (x==y) = F, (x==y-1) = T (x==y) = T, (x==y-1) = F

Example 6 x=abs(?); y=x; while(x!=0) { x--; y--; } assert x==y;

Change the abstraction to match the program Abstraction Refinement program specification Abstract counter example abstraction Abstraction Refinement  Abstract counter example Verify Valid 7

Predicate Abstraction and Boolean Programs  Given a program P and a finite vocabulary F we can take two similar (but different!) approaches  compute  P  # abstract interpretation over F  construct a Boolean program BP = B(P,F) and compute  BP  concrete interpretation  BP guaranteed to be finite-state 8

Boolean Program: Example 9 x=abs(?); y=x; while(x!=0) { x--; y--; } assert x==y; x=abs(?); (x==y) = T while(?) { (x==y-1) =T; (x==y) = F (x==y-1) =F; (x==y) = T } assert ( (x==y) == T ); Use the predicates to construct a Boolean program (how? coming up soon)

prog. P’ prog. P SLIC rule The SLAM Process boolean program path predicates slic c2bp bebop newton

State Machine for Locking UnlockedLocked Error Rel Acq Rel state { enum {Locked,Unlocked} s = Unlocked; } KeAcquireSpinLock.entry { if (s==Locked) abort; else s = Locked; } KeReleaseSpinLock.entry { if (s==Unlocked) abort; else s = Unlocked; }

do { KeAcquireSpinLock(); nPacketsOld = nPackets; if(request){ request = request->Next; KeReleaseSpinLock(); nPackets++; } } while (nPackets != nPacketsOld); KeReleaseSpinLock(); Example (SLAM) Does this code obey the locking rule?

do { KeAcquireSpinLock(); if(*){ KeReleaseSpinLock(); } } while (*); KeReleaseSpinLock(); Model checking boolean program (bebop) U L L L L U L U U U E Example (SLAM)

do { KeAcquireSpinLock(); nPacketsOld = nPackets; if(request){ request = request->Next; KeReleaseSpinLock(); nPackets++; } } while (nPackets != nPacketsOld); KeReleaseSpinLock(); Is error path feasible in C program? (newton) U L L L L U L U U U E Example (SLAM)

do { KeAcquireSpinLock(); nPacketsOld = nPackets; b = true; if(request){ request = request->Next; KeReleaseSpinLock(); nPackets++; b = (b ? false : *); } } while (nPackets != nPacketsOld); !b KeReleaseSpinLock(); Add new predicate to boolean program (c2bp) b : (nPacketsOld == nPackets) U L L L L U L U U U E Example (SLAM)

do { KeAcquireSpinLock(); b = true; if(*){ KeReleaseSpinLock(); b = b ? false : *; } } while ( !b ); KeReleaseSpinLock(); b b b b Model checking refined boolean program (bebop) U L L L L U L U U U E b b !b Example (SLAM) b : (nPacketsOld == nPackets)

do { KeAcquireSpinLock(); b = true; if(*){ KeReleaseSpinLock(); b = b ? false : *; } } while ( !b ); KeReleaseSpinLock(); b b b b U L L L L U L U U b b !b Model checking refined boolean program (bebop) Example (SLAM) b : (nPacketsOld == nPackets)

c2bp: Predicate Abstraction for C Programs Given  P : a C program  F = {e 1,...,e n }  each e i a pure boolean expression  each e i represents set of states for which e i is true Produce a boolean program B(P,F)  same control-flow structure as P  boolean vars {b 1,...,b n } to match {e 1,...,e n }  soundness: properties true of B(P,F) are true of P

Assumptions Given  P : a C program  F = {e 1,...,e n }  each e i a pure boolean expression  each e i represents set of states for which e i is true  Assume: each e i uses either:  only globals (global predicate)  local variables from some procedure (local predicate for that procedure)  Mixed predicates:  predicates using both local variables and global variables  complicate “return” processing  advanced… we won’t cover it

C2bp Algorithm  Performs modular abstraction  abstracts each procedure in isolation  Within each procedure, abstracts each statement in isolation  no control-flow analysis  no need for loop invariants

void cmp (int a, int b) { goto L1, L2 L1: assume(a==b); g = 0; return; L2: assume(a!=b); g = 1; return; } int g; main(int x, int y){ cmp(x, y); assume(!g); assume(x != y) assert(0); } Preds: {x==y} {g==0} {a==b}

void cmp (int a, int b) { goto L1, L2 L1: assume(a==b); g = 0; return; L2: assume(a!=b); g = 1; return; } int g; main(int x, int y){ cmp(x, y); assume(!g); assume(x != y) assert(0); } decl {g==0} ; main( {x==y} ) { } void cmp ( {a==b} ) { } Preds: {x==y} {g==0} {a==b}

void cmp (int a, int b) { goto L1, L2 L1: assume(a==b); g = 0; return; L2: assume(a!=b); g = 1; return; } int g; main(int x, int y){ cmp(x, y); assume(!g); assume(x != y) assert(0); } decl {g==0} ; main( {x==y} ) { cmp( {x==y} ); assume( {g==0} ); assume( !{x==y} ); assert(0); } void cmp ( {a==b} ) { goto L1, L2; L1: assume( {a==b} ); {g==0} = T; return; L2: assume( !{a==b} ); {g==0} = F; return; } Preds: {x==y} {g==0} {a==b}

Abstract Transformers? 24 P1, P2 stmt ? abstract state S # which predicates should hold in the resulting abstract state?

Abstract Transformers? 25 P1  y = y +1  # ? abstract state S # vocabulary = { p1 = (y < 4), p2 = (y < 5) }

Abstract Transformers? 26 P1  y = y +1  # p1 = (y < 4), p2 = (y < 5) (y < 4)  y = y +1  (y < 5) P2

Can also phrase it with WP  To check if a predicate should hold in the next abstract state  check the weakest precondition of the predicate’s defining formula wrt statement 27 P1, P2 stmt ? abstract state S’ # which predicates should hold in S # so P1,P2 hold in S’ # ? abstract state S #

 WP(x=e,Q) = Q[x  e]  Effect of statement y = y + 1  Vocabulary = { y < 4, y < 5 }  WP(y=y+1, y<5)= (y<5) [y  y+1] = (y+1<5) = (y<4) Abstracting Assigns via WP

WP Problem  WP(s, e i ) not always expressible via { e 1,...,e n }  (Vocabulary not closed under WP)  Example  F = { x==0, x==1, x<5 }  WP( x=x+1, x<5 ) = x<4  Best possible: x==0 || x==1

Transformers via WP 30  x = x +1  # p1 = (x==0), p2 = (x==1), p3 = (x < 5) (x < 4) wp(x=x+1,x<5) (x < 5) P3 No matching predicates

Transformers via WP 31  x = x +1  # p1 = (x==0), p2 = (x==1), p3 = (x < 5) (x < 4) wp(x=x+1,x<5) (x < 5) P3 idea: (x==0) or (x==1) imply that (x<4)

Abstracting Expressions via F  F = { e 1,...,e n }  Implies F (e)  best boolean function over F that implies e  ImpliedBy F (e)  best boolean function over F implied by e  ImpliedBy F (e) = !Implies F (!e)

Implies F (e) and ImpliedBy F (e) e Implies F (e) ImpliedBy F (e)

Computing Implies F (e)  minterm m = d 1 &&... && d n  where d i = e i or d i = !e i  Implies F (e)  disjunction of all minterms that imply e  Naïve approach  generate all 2 n possible minterms  for each minterm m, use decision procedure to check validity of each implication m  e  Many optimizations possible

Abstracting Assignments  if Implies F (WP(s, e i )) is true before s then  e i is true after s  if Implies F (WP(s, !e i )) is true before s then  e i is false after s {e i } = Implies F (WP(s, e i )) ? true : Implies F (WP(s, !e i )) ? false : *;

Assignment Example Statement in P: Predicates in E: y = y+1; {x==y} Weakest Precondition: WP(y=y+1, x==y) = x==y+1 Implies F ( x==y+1 ) = false Implies F ( x!=y+1 ) = x==y Abstraction of assignment in B: {x==y} = ({x==y} ? false : *);

Absracting Assumes  WP( assume(e), Q) = e  Q  assume(e) is abstracted to: assume( ImpliedBy F (e) )  Example: F = {x==2, x<5} assume(x < 2) is abstracted to: assume( {x<5} && !{x==2} )

Assignments + Pointers Weakest Precondition: WP( *p=3, x==5 ) = x==5 What if *p and x alias? Correct Weakest Precondition: (p==&x and 3==5) or (p!=&x and x==5) Statement in P:Predicates in E: *p = 3 {x==5}

Precision  For program P and E = {e 1,...,e n }, there exist two “ideal” abstractions:  Boolean(P,E): most precise abstraction  Cartesian(P,E): less precise abtraction, where each boolean variable is updated independently  [See Ball-Podelski-Rajamani, TACAS 00]  Theory  with an “ideal” theorem prover, c2bp can compute Cartesian(P,E)  Practice  c2bp computes a less precise abstraction than Cartesian(P,E)  we use Das/Dill’s technique to incrementally improve precision  with an “ideal” theorem prover, the combination of c2bp + Das/Dill can compute Boolean(P,E)

prog. P’ prog. P SLIC rule The SLAM Process boolean program path predicates slic c2bp bebop newton

Bebop  Model checker for boolean programs  Based on CFL reachability  [Sharir-Pnueli 81] [Reps-Sagiv-Horwitz 95]  Iterative addition of edges to graph  “path edges”:   “summary edges”: 

Symbolic CFL reachability  Partition path edges by their “target”  PE(v) = { |  }  What is for boolean programs?  A bit-vector!  What is PE(v)?  A set of bit-vectors  Use a BDD (attached to v) to represent PE(v)

BDDs  Canonical representation of  boolean functions  set of (fixed-length) bitvectors  binary relations over finite domains  Efficient algorithms for common dataflow operations  transfer function  join/meet  subsumption test void cmp ( e2 ) { [5]Goto L1, L2 [6]L1: assume( e2 ); [7] gz = T; goto L3; [8]L2: assume( !e2 ); [9]gz = F; goto L3 [10] L3: return; } e2=e2’ & gz’=e2’ BDD at line [10] of cmp: Read: “cmp leaves e2 unchanged and sets gz to have the same final value as e2”

gz=gz’& e=e’ e=e’& gz’=e’ e=e’ & gz’=1 & e’=1 gz=gz’& e2=e2’ gz=gz’& e2=e2’& e2’=T e2=e2’& gz’=e2’ decl gz ; main( e ) { [1] cmp( e ); [2] assume( gz ); [3] assume( !e ); [4] assert(F); } void cmp ( e2 ) { [5]Goto L1, L2 [6]L1: assume( e2 ); [7] gz = T; goto L3; [8]L2: assume( !e2 ); [9]gz = F; goto L3 [10] L3: return; } gz=gz’& e2=e2’& e2’=F e2=e2’& e2’=T & gz’=T e2=e2’& e2’=F & gz’=F e2=e

Bebop: summary  Explicit representation of CFG  Implicit representation of path edges and summary edges  Generation of hierarchical error traces  Complexity: O(E * 2 O(N) )  E is the size of the CFG  N is the max. number of variables in scope

prog. P’ prog. P SLIC rule The SLAM Process boolean program path predicates slic c2bp bebop newton

Newton  Given an error path p in boolean program B  is p a feasible path of the corresponding C program?  Yes: found an error  No: find predicates that explain the infeasibility  uses the same interfaces to the theorem provers as c2bp.

Newton  Execute path symbolically  Check conditions for inconsistency using theorem prover (satisfiability)  After detecting inconsistency  minimize inconsistent conditions  traverse dependencies  obtain predicates

Symbolic simulation for C-- Domains  variables: names in the program  values: constants + symbols State of the simulator has 3 components:  store: map from variables to values  conditions: predicates over symbols  history: past valuations of the store

Symbolic simulation Algorithm Input: path p For each statement s in p do match s with Assign(x,e): let val = Eval(e) in if (Store[x]) is defined then History[x] := History[x]  Store[x] Store[x] := val Assume(e): let val = Eval(e) in Cond := Cond and val let result = CheckConsistency(Cond) in if (result == “inconsistent”) then GenerateInconsistentPredicates() End Say “Path p is feasible”

Symbolic Simulation: Caveats  Procedure calls  add a stack to the simulator  push and pop stack frames on calls and returns  implement mappings to keep values “in scope” at calls and returns  Dependencies  for each condition or store, keep track of which values were used to generate this value  traverse dependency during predicate generation

void cmp (int a, int b) { Goto L1, L2 L1: assume(a==b); g = 0; return; L2: assume(a!=b); g = 1; return; } int g; main(int x, int y){ cmp(x, y); assume(!g); assume(x != y) assert(0); }

void cmp (int a, int b) { Goto L1, L2 L1: assume(a==b); g = 0; return; L2: assume(a!=b); g = 1; return; } int g; main(int x, int y){ cmp(x, y); assume(!g); assume(x != y) assert(0); } Global: main: (1)x: X (2)y: Y Conditions :

void cmp (int a, int b) { Goto L1, L2 L1: assume(a==b); g = 0; return; L2: assume(a!=b); g = 1; return; } int g; main(int x, int y){ cmp(x, y); assume(!g); assume(x != y) assert(0); } Global: main: (1)x: X (2)y: Y cmp : (3)a: A (4)b: B Conditions : Map : X  A Y  B

void cmp (int a, int b) { Goto L1, L2 L1: assume(a==b); g = 0; return; L2: assume(a!=b); g = 1; return; } int g; main(int x, int y){ cmp(x, y); assume(!g); assume(x != y) assert(0); } Global: (6) g: 0 main: (1)x: X (2)y: Y cmp : (3)a: A (4)b: B Conditions : (5)(A == B) [3, 4] Map : X  A Y  B

void cmp (int a, int b) { Goto L1, L2 L1: assume(a==b); g = 0; return; L2: assume(a!=b); g = 1; return; } int g; main(int x, int y){ cmp(x, y); assume(!g); assume(x != y) assert(0); } Global: (6) g: 0 main: (1)x: X (2)y: Y cmp : (3)a: A (4)b: B Conditions : (5)(A == B) [3, 4] (6)(X == Y) [5] Map : X  A Y  B

void cmp (int a, int b) { Goto L1, L2 L1: assume(a==b); g = 0; return; L2: assume(a!=b); g = 1; return; } int g; main(int x, int y){ cmp(x, y); assume(!g); assume(x != y) assert(0); } Global: (6) g: 0 main: (1)x: X (2)y: Y cmp : (3)a: A (4)b: B Conditions : (5)(A == B) [3, 4] (6)(X == Y) [5] (7) (X != Y) [1, 2]

void cmp (int a, int b) { Goto L1, L2 L1: assume(a==b); g = 0; return; L2: assume(a!=b); g = 1; return; } int g; main(int x, int y){ cmp(x, y); assume(!g); assume(x != y) assert(0); } Global: (6) g: 0 main: (1)x: X (2)y: Y cmp : (3)a: A (4)b: B Conditions : (5)(A == B) [3, 4] (6)(X == Y) [5] (7) (X != Y) [1, 2] Contradictory!

void cmp (int a, int b) { Goto L1, L2 L1: assume(a==b); g = 0; return; L2: assume(a!=b); g = 1; return; } int g; main(int x, int y){ cmp(x, y); assume(!g); assume(x != y) assert(0); } Global: (6) g: 0 main: (1)x: X (2)y: Y cmp : (3)a: A (4)b: B Conditions : (5)(A == B) [3, 4] (6)(X == Y) [5] (7) (X != Y) [1, 2] Contradictory!

void cmp (int a, int b) { Goto L1, L2 L1: assume(a==b); g = 0; return; L2: assume(a!=b); g = 1; return; } int g; main(int x, int y){ cmp(x, y); assume(!g); assume(x != y) assert(0); } Predicates after simplification: { x == y, a == b }

Recap  Predicate Abstraction (via SLAM)  CEGAR (without the details) 61

[Roman Manevich et. al. VMCAI’05] 62

Motivating Example 1: CEGAR curr = head; while (curr != tail) { assert (curr != null); curr = curr.n; } curr n nnn tail … CEGAR generates following predicates: curr.n ≠ null, curr.n.n ≠ null, … after i refinement steps: curr(.n) i ≠ null head 63

Motivating Example 1: CEGAR curr = head; while (curr != tail) { assert (curr != null); curr = curr.n; } n nnn tail … In general, problem is undecidable: V. Chakaravathy [POPL 2003] State-of-the-art canonical abstractions can prove assertion curr head 64

Motivating Example 2 cyclic(x) t = null; y = x; while (t != x && y.data < low) { t = y.n; y = t; } z = y; while (z != x && z.data < high) { t = z.n; z = t; } t = null; if (y != z) { y.n = null; y.n = z; } cyclic(x) 65

Motivating Example 2 x n n n n n nn y z x n n n nn y cyclic(x) 66

Existing Canonical Abstraction x,cn rx,ry,rz n n y,cn rx,ry,rz z,cn rx,ry,rz n n n n n x n n n n n nn y z cn rx,ry,rz concreteabstract order between variables lost! cannot cyclic(x) 67

Overview and Main Results  Current predicate abstraction refinement methods not adequate for analyzing heaps  Predicate abstraction can simulate arbitrary finite abstract domains  Often requires too many predicates  New family of abstractions for lists  Bounded number of sharing patterns  Handles cycles more precisely than existing canonical abstractions  Encode abstraction with two methods  Canonical abstraction  Polynomial predicate abstraction 68

Outline  New abstractions for lists  Observations on concrete shapes  Static naming scheme  Encoding via predicate abstraction  Encoding via canonical abstraction  Controlling the number of predicates via heap-sharing depth parameter  Conclusion 69

Concrete Shapes  Assume the following class of (list-) heaps  Heap contains only singly-linked lists  No garbage (easy to handle)  A heap can be decomposed into  Basic shape (sharing pattern)  List lengths 70

Concrete Shapes x y class SLL { Object value; SLL n; } n nnnnnnnnn nnn n 71

Interrupting Nodes x y Interruption: node pointed-to by a variable or shared by n fields #interruptions ≤ 2 · #variables (bounded number of sharing patterns) n nnnnnnnnn nnn n 72

Maximal Uninterrupted Lists x y Maximal uninterrupted list: maximal list segment between two interruptions not containing interruptions in-between n nnnnnnnnn nnn n 73

Maximal Uninterrupted Lists x y max. uninterrupted 2max. uninterrupted 1 max. uninterrupted 3 max. uninterrupted 4 n nnnnnnnnn nnn n 74

Maximal Uninterrupted Lists x y n nnnnnnnnn nnn n number of links 75

Maximal Uninterrupted Lists x y n nnnnnnnnn nnn n 2>2 Abstract lengths: {1,2,>2} 76

Using Static Names  Goal: name all sharing patterns  Prepare static names for interruptions  Derive predicates for canonical abstraction  Prepare static names for max. uninterrupted lists  Derive predicates for predicate abstraction  All names expressed by FO TC formulae 77

Naming Interruptions x y x1 y1 x2 y2 We name interruptions by adding auxiliary variables For every variable x : x1, …,xk (k=#variables) x y n nnnnnnnnn nnnn 78

Naming Max. Uninterrupted Lists x y x1 y1 x2 y2 x y [x1,x2] [x1,y2] [y1,x2] [y1,y2] [x,x1] [x,y1] [x2,x2] [x2,y2] [y2,x2] [y2,y2] [y,x1] [y,y1] n nnnnnnnnn nnnn 79

A Predicate Abstraction  For every pair of variables x,y (regular and auxiliary)  Aliased[x,y] = x and y point to same node  UList1[x,y] = max. uninterrupted list of length 1  UList2[x,y] = max. uninterrupted list of length 2  UList[x,y] = max. uninterrupted list of any length  For every variable x (regular and auxiliary)  UList1[x,null] = max. uninterrupted list of length 1  UList2[x,null] = max. uninterrupted list of length 2  UList[x,null] = max. uninterrupted list of any length  Predicates expressed by FO TC formulae 80

Predicate Abstraction Example x y x1 y1 x2 y2 x y n nnnnnnnnn nnnn Aliased[x2,x2]Aliased[x1,x1]Aliased[y,y]Aliased[x,x] Aliased[y1,x1]Aliased[x1,y1]Aliased[y2,y2]Aliased[y1,y1] UList[x,y1]UList[x,x1]Aliased[y2,x2]Aliased[x2,y2] UList2[y1,y2]UList2[y1,x2]UList2[x1,y2]UList2[x1,x2] UList[y1,y2]UList[y1,x2]UList[x1,y2]UList[x1,x2] UList[x2,y2]UList[x2,x2]UList[y,y1]UList[y,x1] UList[y2,y2]UList[y2,x2] concrete abstract 81

A Canonical Abstraction  For every variable x (regular and auxiliary)  x(v) = v is pointed-to by x  cul[x](v) = uninterrupted list from node pointed-to by x to v  Predicates expressed by FO TC formulae 82

Canonical Abstraction Example x y x1 y1 x2 y2 x y cul[x] cul[y] cul[x1] cul[y1] cul[x2] cul[y2] n nnnnnnnnn nnnn concrete 83

Canonical Abstraction Example x y x1 y1 x2 y2 x y cul[x] cul[y] cul[x1] cul[y1] cul[x2] cul[y2] n nnnnn n n n nn abstract 84

Canonical Abstraction of Cyclic List x n n n n n nn y z concreteabstract x n n n nn y z cul[x] cul[y] cul[z] n n 85

Canonical Abstraction of Cyclic List abstract preabstract post x n n n nn y z cul[x] cul[y] cul[z] n n x n n n nn y z cul[x] cul[y] cul[z] 86

Related Work  Dor, Rode and Sagiv [SAS ’00]  Checking cleanness in lists  Sagiv, Reps and Wilhelm [TOPLAS ‘02]  General framework + abstractions for lists  Dams and Namjoshi [VMCAI ’03]  Semi-automatic predicate abstraction for shape analysis  Balaban, Pnueli and Zuck [VMCAI ’05]  Predicate abstraction for shapes via small models  Deutsch [PLDI ’94]  Symbolic access paths with lengths 87

Conclusion  New abstractions for lists  Observations about concrete shapes  Precise for programs containing heaps with sharing and cycles, ignoring list lengths  Parametric in sharing-depth d:[1…k]  Encoded new abstractions via  Canonical abstraction O(d·k)  Polynomial predicate abstraction O(d 2 ·k 2 )  d=1 sufficient for all examples 88