360 likes | 465 Views
Program Analysis via Satisfiability Modulo Path Programs. William Harris , Sriram Sankaranarayanan , Franjo Ivan č i ć , Aarti Gupta. POPL 2010. Assertions as Specifications. Lightweight Often automatic from semantics Null-pointer dereferences Buffer overflows.
E N D
Program Analysis viaSatisfiability Modulo Path Programs William Harris, SriramSankaranarayanan, FranjoIvančić, Aarti Gupta POPL2010
Assertions as Specifications • Lightweight • Often automatic from semantics • Null-pointer dereferences • Buffer overflows
proc. foo(int* p, intpLen, int mode) assume (pLen > 1); int off, L := 1, bLen := 0; if (p = NULL) pLen := -1; if (mode = 0) off := 1; else off := 0; while (L <= pLen) bLen := L – off; L := 2 * L; assert(!p || bLen <= pLen);
Path Program: Left Branch, Left Branch L := 1 bLen := 0 pLen >= 1 p = 0 L = 1 ÆbLen = 0 ÆpLen¸ 1 ... Æ p = 0 p != 0 pLen := -1 … Æ p = 0 ÆpLen = -1 mode = 0 mode != 0 … Æ p = 0 Æ mode = 0 off := 1 off := 0 … Æ p = 0 … Æ p = 0 L > pLen p != 0 && bLen > pLen L <= pLen bLen := L – off L := L * 2 False
Path Program: Left Branch, Right Branch L := 1 bLen := 0 pLen >= 1 p = 0 L = 1 ÆbLen = 0 ÆpLen¸ 1 … Æ p = 0 p != 0 pLen := -1 … Æ p =0 mode = 0 mode != 0 … Æ p = 0 Æ mode 0 off := 0 off := 1 … Æ p = 0 … Æ p = 0 L > pLen L <= pLen bLen := L – off L := L * 2 p != 0 && bLen > pLen False
Path Program: Right Branch, Left Branch L := 1 bLen := 0 pLen >= 1 p = 0 L = 1 ÆbLen = 0 ÆpLen¸ 1 p != 0 pLen := -1 L = 1 ÆbLen = 0 ÆpLen¸ 1 mode = 0 mode != 0 L = 1 ÆbLen = 0 ÆpLen¸ 1 off := 0 off := 1 bLen·pLen bLen·pLen L > pLen L <= pLen bLen := L – off L := L * 2 p != 0 && bLen > pLen False
Path Program: Right Branch, Right Branch L := 1 bLen := 0 pLen >= 1 p = 0 L = 1 ÆbLen = 0 ÆpLen¸ 1 p != 0 pLen := -1 L = 1 ÆbLen = 0 Æ p 0 mode = 0 mode != 0 L = 1 ÆbLen = 0 ÆpLen¸ 1 off := 0 off := 1 bLen·pLen bLen·pLen L > pLen L <= pLen bLen := L – off L := L * 2 p != 0 && bLen > pLen False
Control-Flow Abstraction L := 1 bLen := 0 pLen >= 1 L := 1 bLen := 0 pLen >= 1 bLen·pLen p != 0 bLen·pLen mode != 0 bLen·pLen off := 1 bLen·pLen bLen·pLen L > pLen p != 0 && bLen > pLen p != 0 && bLen > pLen L <= pLen bLen := L – off L := L * 2 False
Key Issues Need: • abstraction • refinement that allow us to analyze a small set of path programs, generalize proofs.
Road Map • Satisfiability Modulo Path Programs (SMPP) • Experimental Evaluation
Abstraction • Encode unproven path programs as propositional formula. • Query SAT solver for solution. • From the solution, extract an unverified path program.
Propositional Variables for Edges q0 q1 q2 q3 q5 q4 q6 q7 q8 q9
Encoding Path Programs q0 = True q0 q9 q9 = True
Encoding Path Programs q3!exactlyOne(q4, q5) q2!exactlyOne(q4, q5) q4!exactlyOne(q3, q2) q5!exactlyOne(q3, q2) q3 q2 q4 q5
Initial Abstraction of Example q0 Æq0$exactlyOne(q1, q2) Æq1$q3 ÆexactlyOne(q3, q2) $exactlyOne(q4, q5) Æ (q4$q6) Æ (q5$q7) ÆexactlyOne(q6, q7) $q8 Æq8$q9 Æq9 q0 Æq0$exactlyOne(q1, q2) • Æq1$q3 • ÆexactlyOne(q3, q2) $exactlyOne(q4, q5) • Æ(q4$q6) Æ(q5$q7) • ÆexactlyOne(q6, q7) $q8 • Æq8$q9 • Æq9 ¤ :=
A Path Program from a SAT Solution q0 q0 q1 q2 q2 q3 q5 q5 q4 q6 q7 q7 q8 q8 q9 q9
Refinement • Applyprogram analysis oracle to determine safety of path program • If safe, then encode safety in the abstraction
Apply Analysis Oracle: Naïve L := 1 bLen := 0 pLen >= 1 p = 0 L = 1 ÆbLen = 0 ÆpLen¸ 1 p != 0 pLen := -1 L = 1 ÆbLen = 0 Æ p 0 mode = 0 mode != 0 L = 1 ÆbLen = 0 ÆpLen¸ 1 off := 0 off := 1 bLen·pLen bLen·pLen L > pLen p != 0 && bLen > pLen L <= pLen bLen := L – off L := L * 2 False
Prop. Encoding: Naïve q0 q1 q2 q3 q4 q5 q6 q7 q8 q9
Naïve Blocking Clause ¤ := ¤Æ : (q0Æ q2Æ q5Æ q7Æ q8Æ q9)
Apply Analysis Oracle: Local Repair L := 1 bLen := 0 pLen >= 1 L = 1 ÆbLen = 0 ÆpLen¸1 p = 0 p != 0 pLen := -1 L = 1 ÆbLen = 0 ÆpLen¸ 1 Æ p 0 mode = 0 mode != 0 L = 1 ÆbLen = 0 ÆpLen¸ 1 Æ p 0 Æmode 0 off := 0 off := 1 bLen·pLen Æ off = 1 bLen·pLen Æ off = 1 L > pLen P != 0 && bLen > pLen L <= pLen bLen := L – off L := L * 2 False
Apply Analysis Oracle: Local Repair L := 1 bLen := 0 pLen >= 1 L := 1 bLen := 0 pLen >= 1 L = 1 ÆbLen = 0 ÆpLen¸ 1 p = 0 p != 0 pLen := -1 pLen := -1 L = 1 ÆbLen = 0 ÆpLen¸ 1 Æ p 0 L = 1 ÆbLen = 0 ÆpLen¸ 1 mode = 0 mode != 0 L = 1 ÆbLen = 0 ÆpLen¸ 1 L = 1 ÆbLen = 0 ÆpLen¸ 1 Æ p 0 Æ Mode 0 off := 0 off := 1 bLen·pLen bLen·pLenÆ off = 1 bLen·pLen Æ off = 1 bLen·pLen L > pLen p != 0 && bLen > pLen p != 0 && bLen > pLen L <= pLen bLen := L – off L := L * 2 False
Prop. Encoding: Local Repair q0 q1 q2 q3 q4 q5 q6 q7 q8 q9
Blocking Clause with Local Repair (:(q0Æq9) Çq3) : (q0Æq2Æq5Æq7Æq8Æq9) ¤ := ¤Æ
One More Path Program Suffices L := 1 bLen := 0 pLen >= 1 p = 0 p = 0 L = 1 ÆbLen = 0 ÆpLen¸ 1 ... Æ p = 0 p != 0 pLen := -1 … Æ p = 0 ÆpLen = -1 mode = 0 mode != 0 … Æ p = 0 Æ mode = 0 off := 0 off := 1 … Æ p = 0 … Æ p = 0 L > pLen L <= pLen bLen := L – off L := L * 2 p != 0 && bLen > pLen p != 0 && bLen > pLen False
Zitser Benchmarks • Real world programs: • wu-ftpd • bind • sendmail • Checked for buffer overflow bugs • BLAST proves more properties on average • SMPP completes faster (>100x)
Larger Benchmarks • Real-world programs: • thttpd • ssh-server • xvidcore • Checked function pre, post conditions for buffer accesses • SMPP proved ~35% of thousands of properties
Conclusion • SMPP uses a symbolic abstraction refinement scheme forcontrol-flow. • SMPP is slightly coarser than predicate abstraction, but converges much faster.
Predicate Abstraction L := 1 bLen := 0 pLen >= 1 : (bLen·pLen) bLen·pLen p != 0 bLen·pLen : (bLen·pLen) mode != 0 : (bLen·pLen) bLen·pLen : (bLen·pLen) off := 1 L > pLen bLen·pLen bLen·pLen : (bLen·pLen) p != 0 && bLen > pLen L <= pLen bLen := L – off L := L * 2 False
SMPP: Path Program 1 L := 1 bLen := 0 pLen >= 1 L := 1 bLen := 0 pLen >= 1 p = 0 L = 1 ÆbLen = 0 ÆpLen¸ 1 p != 0 pLen := -1 pLen := -1 L = 1 ÆbLen = 0 Æ p 0 mode = 0 mode != 0 L = 1 ÆbLen = 0 ÆpLen¸ 1 off := 0 off := 1 bLen·pLen bLen·pLen L > pLen p != 0 && bLen > pLen p != 0 && bLen > pLen L <= pLen bLen := L – off L := L * 2 False
SMPP: Path Program 2 L := 1 bLen := 0 pLen >= 1 p = 0 p = 0 L = 1 ÆbLen = 0 ÆpLen¸ 1 ... Æ p = 0 p != 0 pLen := -1 … Æ p = 0 ÆpLen = -1 mode = 0 mode != 0 … Æ p = 0 Æ mode = 0 off := 0 off := 1 … Æ p = 0 … Æ p = 0 L > pLen L <= pLen bLen := L – off L := L * 2 p != 0 && bLen > pLen p != 0 && bLen > pLen False
Problem Statement SMT SMPP Given a disjunctive formula branching program determine satisfiability safety using theory solvers analyses for conjunctive formulas. path programs.
Key Analog • Abstraction using a propositional encoding • Refinement using blocking clauses conjoined to abstraction