Abstraction of Source Code (from Bandera lectures and talks)

Slides:



Advertisements
Similar presentations
Technologies for finding errors in object-oriented software K. Rustan M. Leino Microsoft Research, Redmond, WA Lecture 1 Summer school on Formal Models.
Advertisements

Automated Theorem Proving Lecture 1. Program verification is undecidable! Given program P and specification S, does P satisfy S?
In this episode of The Verification Corner, Rustan Leino talks about Loop Invariants. He gives a brief summary of the theoretical foundations and shows.
An Abstract Interpretation Framework for Refactoring P. Cousot, NYU, ENS, CNRS, INRIA R. Cousot, ENS, CNRS, INRIA F. Logozzo, M. Barnett, Microsoft Research.
Semantics Static semantics Dynamic semantics attribute grammars
Greta YorshEran YahavMartin Vechev IBM Research. { ……………… …… …………………. ……………………. ………………………… } T1() Challenge: Correct and Efficient Synchronization { ……………………………
ICE1341 Programming Languages Spring 2005 Lecture #6 Lecture #6 In-Young Ko iko.AT. icu.ac.kr iko.AT. icu.ac.kr Information and Communications University.
Compilation 2011 Static Analysis Johnni Winther Michael I. Schwartzbach Aarhus University.
Abstraction and Modular Reasoning for the Verification of Software Corina Pasareanu NASA Ames Research Center.
Reasoning About Code; Hoare Logic, continued
Hoare’s Correctness Triplets Dijkstra’s Predicate Transformers
Rigorous Software Development CSCI-GA Instructor: Thomas Wies Spring 2012 Lecture 11.
Rigorous Software Development CSCI-GA Instructor: Thomas Wies Spring 2012 Lecture 13.
1 Temporal Claims A temporal claim is defined in Promela by the syntax: never { … body … } never is a keyword, like proctype. The body is the same as for.
(c) 2007 Mauro Pezzè & Michal Young Ch 7, slide 1 Symbolic Execution and Proof of Properties.
Partial correctness © Marcelo d’Amorim 2010.
Copyright © 2006 Addison-Wesley. All rights reserved.1-1 ICS 410: Programming Languages Chapter 3 : Describing Syntax and Semantics Axiomatic Semantics.
ISBN Chapter 3 Describing Syntax and Semantics.
1 Semantic Description of Programming languages. 2 Static versus Dynamic Semantics n Static Semantics represents legal forms of programs that cannot be.
1/22 Programs : Semantics and Verification Charngki PSWLAB Programs: Semantics and Verification Mordechai Ben-Ari Mathematical Logic for Computer.
Weakest pre-conditions and towards machine consistency Saima Zareen.
CS 355 – Programming Languages
The Software Model Checker BLAST by Dirk Beyer, Thomas A. Henzinger, Ranjit Jhala and Rupak Majumdar Presented by Yunho Kim Provable Software Lab, KAIST.
1.2 Row Reduction and Echelon Forms
Formal Methods of Systems Specification Logical Specification of Hard- and Software Prof. Dr. Holger Schlingloff Institut für Informatik der.
A Semantic Characterization of Unbounded-Nondeterministic Abstract State Machines Andreas Glausch and Wolfgang Reisig 1.
Lecture 02 – Structural Operational Semantics (SOS) Eran Yahav 1.
1 Basic abstract interpretation theory. 2 The general idea §a semantics l any definition style, from a denotational definition to a detailed interpreter.
1 Operational Semantics Mooly Sagiv Tel Aviv University Textbook: Semantics with Applications.
ESC Java. Static Analysis Spectrum Power Cost Type checking Data-flow analysis Model checking Program verification AutomatedManual ESC.
CS 267: Automated Verification Lectures 14: Predicate Abstraction, Counter- Example Guided Abstraction Refinement, Abstract Interpretation Instructor:
CS 330 Programming Languages 09 / 18 / 2007 Instructor: Michael Eckmann.
Finding the Weakest Characterization of Erroneous Inputs Dzintars Avots and Benjamin Livshits.
Dr. Muhammed Al-Mulhem 1ICS ICS 535 Design and Implementation of Programming Languages Part 1 Fundamentals (Chapter 4) Axiomatic Semantics ICS 535.
Review: forward E { P } { P && E } TF { P && ! E } { P 1 } { P 2 } { P 1 || P 2 } x = E { P } { \exists … }
Describing Syntax and Semantics
1 Automatic Refinement and Vacuity Detection for Symbolic Trajectory Evaluation Orna Grumberg Technion Haifa, Israel Joint work with Rachel Tzoref.
1 Inference Rules and Proofs (Z); Program Specification and Verification Inference Rules and Proofs (Z); Program Specification and Verification.
ISBN Chapter 3 Describing Semantics -Attribute Grammars -Dynamic Semantics.
CS 363 Comparative Programming Languages Semantics.
1 Bisimulations as a Technique for State Space Reductions.
Finding Feasible Counter-examples when Model Checking Abstracted Java Programs Corina S. Pasareanu, Matthew B. Dwyer (Kansas State University) and Willem.
Lazy Annotation for Program Testing and Verification Speaker: Chen-Hsuan Adonis Lin Advisor: Jie-Hong Roland Jiang November 26,
Program Analysis and Verification Spring 2014 Program Analysis and Verification Lecture 4: Axiomatic Semantics I Roman Manevich Ben-Gurion University.
Chapter 3 Part II Describing Syntax and Semantics.
Semantics In Text: Chapter 3.
COP4020 Programming Languages Introduction to Axiomatic Semantics Prof. Robert van Engelen.
Tool-supported Program Abstraction for Finite-state Verification Matthew Dwyer 1, John Hatcliff 1, Corina Pasareanu 1, Robby 1, Roby Joehanes 1, Shawn.
Static Techniques for V&V. Hierarchy of V&V techniques Static Analysis V&V Dynamic Techniques Model Checking Simulation Symbolic Execution Testing Informal.
Operational Semantics Mooly Sagiv Tel Aviv University Textbook: Semantics with Applications Chapter.
Tool-supported Program Abstraction for Finite-state Verification Matthew Dwyer 1, John Hatcliff 1, Corina Pasareanu 1, Robby 1, Roby Joehanes 1, Shawn.
CSC3315 (Spring 2009)1 CSC 3315 Languages & Compilers Hamid Harroud School of Science and Engineering, Akhawayn University
C HAPTER 3 Describing Syntax and Semantics. D YNAMIC S EMANTICS Describing syntax is relatively simple There is no single widely acceptable notation or.
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 Tel Aviv University Sunday Scrieber 8 Monday Schrieber.
Operational Semantics Mooly Sagiv Reference: Semantics with Applications Chapter 2 H. Nielson and F. Nielson
CORRECTNESS ISSUES AND LOOP INVARIANTS Lecture 8 CS2110 – Fall 2014.
Abstraction and Abstract Interpretation. Abstraction (a simplified view) Abstraction is an effective tool in verification Given a transition system, we.
Weakest Precondition of Unstructured Programs
Abstraction of Source Code
Abstraction Data type based abstractions
Reasoning About Code.
Syntax Questions 6. Define a left recursive grammar rule.
Lecture 5 Floyd-Hoare Style Verification
Over-Approximating Boolean Programs with Unbounded Thread Creation
Semantics In Text: Chapter 3.
The Zoo of Software Security Techniques
Predicate Abstraction
COP4020 Programming Languages
Presentation transcript:

Abstraction of Source Code (from Bandera lectures and talks)

Abstraction: the key to scaling up represents a set of states abstraction Safety: The set of behaviors of the abstract system over-approximates the set of behaviors of the original system Original system Original property P symbolic state Abstract system Abstract property P’

Data Abstraction –Abstraction proceeds component-wise, where variables are components x:int Even Odd…, -3, -1, 1, 3, … …, -2, 0, 2, 4, … 1, 2, 3, … …, -3, -2, -1 0 Pos Neg Zero y:int

Data Type Abstraction int x = 0; if (x == 0) x = x + 1; Data domains (n<0) : NEG (n==0): ZERO (n>0) : POS Signs NEGPOSZERO int Code Signs x = ZERO; if (Signs.eq(x,ZERO)) x = Signs.add(x,POS); Collapses data domains via abstract interpretation:

Hypothesis Abstraction of data domains is necessary Automated support for –Defining abstract domains (and operators) –Selecting abstractions for program components –Generating abstract program models –Interpreting abstract counter-examples will make it possible to –Scale property verification to realistic systems –Ensure the safety of the verification process

Definition of Abstractions in BASL abstraction Signs abstracts int begin TOKENS = { NEG, ZERO, POS }; abstract(n) begin n {NEG}; n == 0 -> {ZERO}; n > 0 -> {POS}; end operator + add begin (NEG, NEG) -> {NEG} ; (NEG, ZERO) -> {NEG} ; (ZERO, NEG) -> {NEG} ; (ZERO, ZERO) -> {ZERO} ; (ZERO, POS) -> {POS} ; (POS, ZERO) -> {POS} ; (POS, POS) -> {POS} ; (_,_) -> {NEG,ZERO,POS}; /* case (POS,NEG),(NEG,POS) */ end Automatic Generation Forall n1,n2: neg?(n1) and neg?(n2) implies not pos?(n1+n2) Forall n1,n2: neg?(n1) and neg?(n2) implies not zero?(n1+n2) Forall n1,n2: neg?(n1) and neg?(n2) implies not neg?(n1+n2) Proof obligations submitted to PVS... Example: Start safe, then refine: +(NEG,NEG)={NEG,ZERO,POS}

Compiling BASL Definitions abstraction Signs abstracts int begin TOKENS = { NEG, ZERO, POS }; abstract(n) begin n {NEG}; n == 0 -> {ZERO}; n > 0 -> {POS}; end operator + add begin (NEG, NEG) -> {NEG} ; (NEG, ZERO) -> {NEG} ; (ZERO, NEG) -> {NEG} ; (ZERO, ZERO) -> {ZERO} ; (ZERO, POS) -> {POS} ; (POS, ZERO) -> {POS} ; (POS, POS) -> {POS} ; (_,_)-> {NEG, ZERO, POS}; /* case (POS,NEG), (NEG,POS) */ end public class Signs { public static final int NEG = 0; // mask 1 public static final int ZERO = 1; // mask 2 public static final int POS = 2; // mask 4 public static int abs(int n) { if (n < 0) return NEG; if (n == 0) return ZERO; if (n > 0) return POS; } public static int add(int arg1, int arg2) { if (arg1==NEG && arg2==NEG) return NEG; if (arg1==NEG && arg2==ZERO) return NEG; if (arg1==ZERO && arg2==NEG) return NEG; if (arg1==ZERO && arg2==ZERO) return ZERO; if (arg1==ZERO && arg2==POS) return POS; if (arg1==POS && arg2==ZERO) return POS; if (arg1==POS && arg2==POS) return POS; return Bandera.choose(7); /* case (POS,NEG), (NEG,POS) */ } Compiled

Interpreting Results Example: x = -2; if(x + 2 == 0) then... x = NEG; if(Signs.eq(Signs.add(x,POS),ZERO)) then... {NEG,ZERO,POS} For an abstracted program, a counter-example may be infeasible because: –Over-approximation introduced by abstraction

Choose-free state space search Theorem [Saidi:SAS’00] Every path in the abstracted program where all assignments are deterministic is a path in the concrete program. Bias the model checker –to look only at paths that do not include instructions that introduce non-determinism JPF model checker modified –to detect non-deterministic choice (i.e. calls to Bandera.choose()); backtrack from those points

Choice-bounded Search choose() X X Detectable Violation Undetectable Violation State space searched

Counter-example guided simulation Use abstract counter-example to guide simulation of concrete program Why it works: –Correspondence between concrete and abstracted program –Unique initial concrete state

Nondeterminism! Java Program: class App{ public static void main(…) { [1] new AThread().start(); … [2] int i=0; [3] while(i<2) { … [4] assert(!Global.done); [5] i++; }}} class Athread extends Thread { public void run() { … [6] Global.done=true; }} Example of Abstracted Code Choose-free counter-example: i=zero Abstracted Program: class App{ public static void main(…) { [1] new AThread().start(); … [2] int i=Signs.ZERO; [3] while(Signs.lt(i,signs.POS)){ … [4] assert(!Global.done); [5] i=Signs.add(i,Signs.POS); }}} class Athread extends Thread { public void run() { … [6] Global.done=true; }}

Example of Abstracted Code Abstract counter-example: Mismatch i=zero i=0 i=zero i=0 i=zero i=0 i=pos i=1 i=pos i=1 i=pos i=1 i=pos i=2 i=pos i=2 Java Program: class App{ public static void main(…) { [1] new AThread().start(); … [2] int i=0; [3] while(i<2) { … [4] assert(!Global.done); [5] i++; }}} class Athread extends Thread { public void run() { … [6] Global.done=true; }} Abstracted Program: class App{ public static void main(…) { [1] new AThread().start(); … [2] int i=Signs.ZERO; [3] while(Signs.lt(i,signs.POS)){ … [4] assert(!Global.done); [5] i=Signs.add(i,Signs.POS); }}} class Athread extends Thread { public void run() { … [6] Global.done=true; }}

Hybrid Approach Choose-free Model Check Abstraction Program & Property Model Check Abstract Program & Property Property true! Property false! (counter-example) Guided Simulation Abstract counter-example Refine selections Mismatch

Property Abstraction System Model Property Program Abstraction (over-approximation) Property Abstraction (under-approximation) If the abstract property holds on the abstract system, then the original property holds on the original system

Property Abstraction Properties are temporal logic formulas, written in negational normal form. Abstract propositions under-approximate the truth of concrete propositions. Examples: –Invariance property: –Abstracted to: –Invariance property: –Abstracted to: G (x > -1)  G ((x == zero) ∨ (x==pos))  G (x > -2)  G ((x == zero) ∨ (x==pos))

Predicate Abstraction –Use a boolean variable to hold the value of an associated predicate that expresses a relationship between variables predicate: x == y true false(1, 2) (0, 0) (1, 1) (-1, -1) (-1, 3) (3, 2) … … int * int

An Example Init: x := 0; y := 0; z := 1; goto Body; Body: assert (z == 1); x := (x + 1); y := (y + 1); if (x == y) then Z1 else Z0; Z1: z := 1; goto Body; Z0: z := 0; goto Body; x and y are unbounded Data abstraction does not work in this case --- abstracting component- wise (per variable) cannot maintain the relationship between x and y We will use predicate abstraction in this example

Predicate Abstraction Process Add boolean variables to your program to represent current state of particular predicates –E.g., add a boolean variable [x=y] to represent whether the condition x==y holds or not These boolean variables are updated whenever program statements update variables mentioned in predicates –E.g., add updates to [x=y] whenever x or y or assigned

An Example Init: x := 0; y := 0; z := 1; goto Body; Body: assert (z = 1); x := (x + 1); y := (y + 1); if (x = y) then Z1 else Z0; Z1: z := 1; goto Body; Z0: z := 0; goto Body; We will use the predicates listed below, and remove variables x and y since they are unbounded. Don’t worry too much yet about how we arrive at this particular set of predicates; we will talk a little bit about that later p1: (x = 0) p2: (y = 0) p3: (x = (y + 1)) p4: (x = y) b1: [(x = 0)] b2: [(y = 0)] b3: [(x = (y + 1))] b4: [(x = y)] Predicates Boolean Variables This is our new syntax for representing boolean variables that helps make the correspondence to the predicates clear

Transforming Programs [(x = 0)] [(y = 0)] [(x = (y + 1))] [(x = y)] x := 0; An example of how to transform an assignment statement PredicatesAssignment Statement [(x=0)] := true; [(x=(y+1))] := if [$(y=0)] then false else top; [(x=y)] := if [$(y = 0)] then true else if ![$(y=0)] then false else top; Where: [$P] = prev. value of [P] top is a non-deterministic choice between true and false The statement to the left is replaced the statements below [(x=0)] := true; [(x= (y+1))] :=H(false, [$(y=0)]); [(x=y)] := H([$(y=0)], ![$(y=0)]); Where: true, if e 1 H (e, e 2 ) = false, if e 2 top, otherwise { Make a more compact representation using a helper function H (following SLAM notation)

State Simulation Given a program abstracted by predicates E 1, …, E n, an abstract state simulates a concrete state if E i holds on the concrete state iff the boolean variable [E i ] is true and remaining concrete vars and control points agree. (n2,[ [x=0] = False, [y=0] = False, [x=(y+1)] = False, [x=y] = True, z = 0]) ConcreteAbstract (n2,[x= 2, y =2, z =0]) simulates (n2,[x =3, y = 3, z = 0]) (n2,[ [x=0] ! False, [y=0] ! True, [x=(y+1)] ! True, [x=y] ! False, z ! 1]) (n2,[x =1, y = 0, z = 1]) simulates (n2,[x = 3, y = 3, z = 1]) does not simulate

Computing Abstracted Programs For each statement s in the original program, we need to compute a new statement that describes how the given predicates change in value due to the effects of s. To do this for a given predicate P i, we need to know if we should set [P i ] to true or false in the abstract target state. Thus, we need to know the conditions at (n 1,  1 ) that guarantee that [P i ] will be true in the target state and the conditions that guarantee that [P i ] will be false in the target state. These conditions will be used in the helper function H. (n 1,   ) (n 2,   ) (n 1, [[P 1 ], [P 2 ], …, [P n ]]) (n 2, [[P 1 ]’, [P 2 ]’, …, [P n ]’]) Truth values of predicates on  1. Truth values of predicates on  2. simulates true, if e 1 [P_i] := H (e, e 2 ) = false, if e 2 top, otherwise { Conditions that make [P i ] true. Conditions that make [P i ] false.

Computing Abstracted Programs What conditions have to hold before a is executed to guarantee that x=y is true (false) after a is executed? –Note: we want the least restrictive conditions The technical term for what we want is the “weakest pre-condition of a with respect to x=y” Example (n 1,   ) (n 2,   ) a: x := 0; [x=y] := H(…?…, …?…) (n 1, [[P 1 ], [P 2 ], …, [P n ]]) (n 2, [[P 1 ]’, [P 2 ]’, …, [P n ]’]) Let’s take a little detour to learn about weakest preconditions.

Floyd-Hoare Triples {F 1 } C {F 2 } Command Pre-condition (boolean formula) Post-condition (boolean formula) For all states s that satisfy F 1 (i.e., s ⊧ F 1 ), if executing C on s terminates with a state s’, then s’ ⊧ F 2. A triple is a logical judgement that holds when the following condition is met:

Weaker/Stronger Formulas If F’ ⇒ F (F’ implies F), we say that F is weaker than F’. Intuitively, F’ contains as least as much information as F because whatever F says about the world can be derived from F’. Intuitively, stronger formulas impose more restrictions on states. S F’ = {s | s ⊧ F’} S F = {s | s ⊧ F} Let Thinking in terms of sets of states… Note that S F’ ⊆ S F since F’ imposes more restrictions than F Question: what formula is the weakest of all? (In other words, what formula describes the largest set of states? What formula imposes the least restrictions?)

Weakest Preconditions The weakest precondition of C with respect to F 2 (denoted WP(C,F 2 )) is a formula F 1 such that {F 1 } C {F 2 } and for all other F’ 1 such that {F’ 1 } C {F 2 }, F’ 1 ⇒ F 1 (F 1 is weaker then F’ 1 ). This notion is useful because it answers the question: “what formula F 1 captures the fewest restrictions that I can impose on a state s so that when s’ = [[C]]s then s’ ⊧ F 2 ?” WP is interesting for us when calculating predicate abstractions because for a given command C and boolean variable [P i ], we want to know the least restrictive conditions that have to hold before C so that we can conclude that P i is definitely true (false) after executing C.

Calculating Weakest Preconditions Intuition: x is going to get a new value from e, so if F has to hold after x := e, then F[x ← e] is required to hold before x := e is executed. Calculating WP for assignments is easy: WP(x := e, F) Examples WP(x := 0, x = y) = (0 = y) = (x = y)[x ← 0] WP(x := 0, x = y + 1)= (x = y + 1)[x ← 0] = (0 = y + 1) = F[x ← e ] WP(x := x+1, x = y + 1)= (x = y + 1)[x ← x + 1] = (x + 1 = y + 1)

Calculating Weakest Preconditions Calculating WP for other commands (state transformers): WP(skip, F) = F WP(assert e, F) = e ⇒ F ( ¬ e ∨ F) WP(assume e, F) = e ⇒ F ( ¬ e ∨ F) Skip: since the store is not modified, then F will hold afterward iff it holds before. Assert and Assume: even though we have a different operational interpretation of assert and assume in the verifier, the definition of WP of these relies on the fact that we assume that if an assertion or assume condition is violated, it’s the same as the command “not completing”. Note that if e is false, then the triple { ( ¬ e ∨ F)} assert e {F} always holds since the command never completes for any state.

Assessment Intuition: Source Program atomic { } Abstracted Program Assignment statement C Assignment to each boolean variable [P i ] where each assignment has the form [P i ] := H(WP(C,P i ),WP(C,!P i )). Transformed But what’s wrong with this? Answer: the predicates P i refer to concrete variables, and the entire purpose of the abstraction process is to remove those from the program. The point is that the conditions in the ‘H’ function should be stated in terms of the boolean variables [P i ] instead of the predicates P i.

Assessment [(x=y)] := H([$(y = 0)],![$(y=0)]); WP(x := 0, x=y) = (0=y) WP(x := 0, !x=y) = !(0=y) In the case of x := 0 and the predicate x = y, we have In this case, the information in the predicate variables is enough to decide whether 0=y holds or not. That is, we can simply generate the assignment statement

Assessment WP(x := 0, (x=y+1)) = (0=y+1) WP(x := 0, !(x=y+1)) = !(0=y+1) In the case of x := 0 and the predicate x = (y+1), we have In this case, we don’t have a predicate variable [0=y+1]. We must consider combinations of our existing predicate variables that imply the conditions above. That is, we consider stronger (more restrictive, less desirable but still useful) conditions formed using the predicate variables that we have.

What Are Appropriate Predicates? In general, a difficult question, and subject of much research Research focuses on automatic discovery of predicates by processing (infeasible) counterexamples If a counterexample is infeasible, add predicates that allow infeasible branches to be avoided counterexample Infeasible branch taken feasible branch If x > y … Add the predicate x > y so that we have enough information to avoid the infeasible branch.

What Are Appropriate Predicates? Use the predicates A mentioned in property P, if variables mentioned in predicates are being removed by abstraction –At least, we want to tell if our property predicates are true or not Use predicates that appear in conditionals along “important paths” –E.g., (x=y) Predicates that allow predicates above to be decided –E.g., (x=0), (y=0), (x = (y + 1)) Some general heuristics that we will follow

{NEG,ZERO,POS}... [1] if(Signs.gt(Signs.add(NEG,POS),ZERO)) then [2] assert(true); else [3] assert(false);... Interpreting Results [1]: [2]: Infeasible counter-example [1]: [2]: [3]: X... [ 1] if ( > 0) then [2] assert(true); else [3] assert(false);... Example of Infeasible Counter-example Signs