Download presentation
Presentation is loading. Please wait.
1
Predicate Abstraction for Software Verification Cormac Flanagan Shaz Qadeer Compaq Systems Research Center
2
POPL02 The Continuing Saga of Predicate Abstraction
3
Extended Static Checking Statically verify many correctness properties Type systems catch many errors –e.g. “Cannot multiply a number and a string” Would like to catch additional errors –e.g. “Array index out of bounds at line 10” And verify other correctness properties –assertions –object invariants –lightweight method specifications
4
Checking loops with ESC/Java /*@ loop_invariant i >= 0; loop_invariant 0 <= spot; loop_invariant spot <= MAXDIRENTRY; loop_invariant (\forall int j; 0 <= j && j < i && bdisk[addr].dirEntries[j].inum != DIRENTRY_UNUSED ==> bdisk[addr].dirEntries[j].name != name); loop_invariant (\forall int j; spot == MAXDIRENTRY && 0 bdisk[addr].dirEntries[j].inum != DIRENTRY_UNUSED); loop_invariant spot == MAXDIRENTRY || bdisk[addr].dirEntries[spot].inum == DIRENTRY_UNUSED; loop_invariant (\forall DirEntry t; t != de ==> t.name == \old(t.name)); loop_invariant (\forall DirEntry t; t != de ==> t.inum == \old(t.inum)); loop_invariant (\forall DirEntry t; t.inum == FS.DIRENTRY_UNUSED || (0 <= t.inum && t.inum < FS.IMAX)); */ for (i = 0; i < cwd.inode.length; i++) { GetDirEntry(de, addr, i); if (de.inum != DIRENTRY_UNUSED && de.name == name) { return ERROR; } if (de.inum == DIRENTRY_UNUSED && spot == MAXDIRENTRY) { spot = i; }
5
Loop invariants C; while e do B end Set of reachable states at loop head is a loop invariant! sp(C, p)p C
6
Concrete states I0I0 I1I1 I2I2 InIn... Abstract states J0J0 J1J1 J2J2 JnJn... (I k ) = J k I k = (J k ) Abstract interpretation Cousot-Cousot 77 Predicate abstraction Graf-Saidi 97
7
Computing loop invariants C; while e do X; Y; end { I0 = (sp(C, true)) } { J0 = ( (I0) e) } { K0 = (sp(X, (J0))) } { L0 = (sp(Y, (K0))) }
8
Computing loop invariants C; while e do X; Y; end { I1 = I0 L0 } { J1 = ( (I1) e) } { K1 = (sp(X, (J1))) } { L1 = (sp(Y, (K1))) }
9
/*@ requires a!=null && b!=null && a.length==b.length ensures \result==a.length || b[\result] */ int find(int[] a, boolean[] b) { int spot = a.length; for (int i=0; i < a.length; i++) { if (spot==a.length && a[i] != 0) spot = i; b[i] = (a[i] != 0); } return spot; } Predicate abstraction example Ten predicates: a != null b != null a.length == b.length spot == a.length b[spot] spot < i 0 <= i i < a.length spot = i a[i] != 0
10
Computing loop invariants C; while e do X; Y; end { I0 = (sp(C, true)) } { L0 = (sp(“X;Y”, (I0) e)) }
11
Computing loop invariants C; while e do X; Y; end { I1 = I0 L0 } { L1 = (sp(“X;Y”, (I1) e)) }
12
/*@ requires a!=null && b!=null && a.length==b.length ensures \result==a.length || b[\result] */ int find(int[] a, boolean[] b) { int spot = a.length; for (int i=0; i < a.length; i++) { if (spot==a.length && a[i] != 0) spot = i; b[i] = (a[i] != 0); } return spot; } Predicate abstraction example Seven predicates: a != null b != null a.length == b.length spot == a.length b[spot] spot < i 0 <= i i < a.length spot = i a[i] != 0
13
Computing loop invariants C; while e do X; Y; end { I0 = (sp(C, true)) } H = havoc variables modified in X;Y P0 = “C;H;assume (I0) e;X;Y” { L0 = (sp(P0, true)) }
14
Computing loop invariants C; while e do X; Y; end { I1 = I0 L0 } H = havoc variables modified in X;Y P1 = “C;H;assume (I1) e;X;Y” { L1 = (sp(P1, true)) }
15
/*@ requires a!=null && b!=null && a.length==b.length ensures \result==a.length || b[\result] */ int find(int[] a, boolean[] b) { int spot = a.length; for (int i=0; i < a.length; i++) { if (spot==a.length && a[i] != 0) spot = i; b[i] = (a[i] != 0); } return spot; } Predicate abstraction example Four predicates: a != null b != null a.length == b.length spot == a.length b[spot] spot < i 0 <= i i < a.length spot = i a[i] != 0
16
/*@ requires a!=null && b!=null && a.length==b.length ensures ( int j; 0<=j && j<\result ==> !b[j]) */ int find(int[] a, boolean[] b) { int spot = a.length; for (int i=0; i < a.length; i++) { if (spot==a.length && a[i] != 0) spot = i; b[i] = (a[i] != 0); } return spot; } Predicate abstraction example
17
( int j; 0 !b[j]) Invariant needed: First method: add predicate ( int j; 0 !b[j]) -quantified loop invariants Better method: add skolem constant int j add predicates 0<=j, j<i, j<spot, !b[j] infer 0 !b[j] Magic: int j; 0 !b[j])
18
Heuristics for guessing predicates for (int i = 0; i < a.length; i++) a[i] = null; Loop targets: i, a[*] First set of predicates: i = \old(i) skolem_constant int sc Second set of predicates: 0 <= sc, sc < i, a[sc] != null Inferred invariant: i >= 0 int sc; 0 <= sc sc < i a[sc] == null
19
Javafe front end to ESC/Java annotated with lightweight specifications 45KLOC, 2418 routines, 520 loops no inference warnings in 326 routines with inference warnings in 31 routines several failing routines had array bound violations –not caught with loop unrolling
20
Computing abstraction function Compute –I 0 = (sp(C, true)) –I n+1 = I n (sp(“C;H;assume (I n ) e;B”, true)) Problem: Given F compute (F) (F) = least boolean function G such that F (G) C; {I?}while e do B end
21
Abstract state space Predicates { a, b, c, d } They generate an abstract space of size 2 4 = 16 F a b a b a b abab cdcd c d c d cdcd State Space (F)
22
Naïve method (slow!) Is F a b c d satisfiable? No! Can compute (F) by asking 2 n such queries a b a b a b abab cdcd c d c d cdcd F (F) XXXX X X XX X XX
23
New method F a b c d ? No! a b a b a b abab cdcd c d c d cdcd F (F) XXXX X X XX X XX F a c d ? No! F c d ? No! Removed 1/4 of state space in 3 queries! = ( c d) ( a c) ( a b) ( c d)
24
Other methods Das-Dill-Park 99 (DDP) Saidi-Shankar 99 (SS)
25
Experiments
26
Experiments (Javafe)
27
Related work Inferring/computing loop invariants –German-Wegbreit 75 –Katz-Manna 76 –Suzuki-Ishihata 77 Predicate abstraction –Graf-Saidi 97 –Bensalem-Lakhnech-Owre 98, Colon-Uribe 98 –Saidi-Shankar 99, Das-Dill-Park 99 –Ball-Majumdar-Millstein-Rajamani 2001 –Henzinger-Jhala-Majumdar-Sutre 2002
Similar presentations
© 2024 SlidePlayer.com Inc.
All rights reserved.