© 2006 Carnegie Mellon University Introduction to CBMC: Part 1 Software Engineering Institute Carnegie Mellon University Pittsburgh, PA 15213 Arie Gurfinkel,

Slides:



Advertisements
Similar presentations
Automated Theorem Proving Lecture 1. Program verification is undecidable! Given program P and specification S, does P satisfy S?
Advertisements

Finding bugs: Analysis Techniques & Tools Symbolic Execution & Constraint Solving CS161 Computer Security Cho, Chia Yuan.
Delta Debugging and Model Checkers for fault localization
© 2006 Carnegie Mellon University Combining Predicate and Numeric Abstraction for Software Model Checking Software Engineering Institute Carnegie Mellon.
Satisfiability Modulo Theories (An introduction)
Programming Languages and Paradigms The C Programming Language.
3-Valued Logic Analyzer (TVP) Tal Lev-Ami and Mooly Sagiv.
1 1 Regression Verification for Multi-Threaded Programs Sagar Chaki, SEI-Pittsburgh Arie Gurfinkel, SEI-Pittsburgh Ofer Strichman, Technion-Haifa Originally.
© 2012 Carnegie Mellon University Introduction to CBMC Software Engineering Institute Carnegie Mellon University Pittsburgh, PA Arie Gurfinkel November.
Pointer applications. Arrays and pointers Name of an array is a pointer constant to the first element whose value cannot be changed Address and name refer.
Kernighan/Ritchie: Kelley/Pohl:
1 Spin Model Checker Samaneh Navabpour Electrical and Computer Engineering Department University of Waterloo SE-464 Summer 2011.
Tuning SAT-checkers for Bounded Model-Checking A bounded guided tour Ofer Strichman Carnegie Mellon University.
6/10/2015C++ for Java Programmers1 Pointers and References Timothy Budd.
1 Predicate Abstraction of ANSI-C Programs using SAT Edmund Clarke Daniel Kroening Natalia Sharygina Karen Yorav (modified by Zaher Andraus for presentation.
Search in the semantic domain. Some definitions atomic formula: smallest formula possible (no sub- formulas) literal: atomic formula or negation of an.
Last time Proof-system search ( ` ) Interpretation search ( ² ) Quantifiers Equality Decision procedures Induction Cross-cutting aspectsMain search strategy.
Honors Compilers An Introduction to Algol-68S Jan 24 th 2002.
Computing Over­Approximations with Bounded Model Checking Daniel Kroening ETH Zürich.
1 Abstraction Refinement for Bounded Model Checking Anubhav Gupta, CMU Ofer Strichman, Technion Highly Jet Lagged.
1 Lab Session-III CSIT-120 Spring 2001 Revising Previous session Data input and output While loop Exercise Limits and Bounds GOTO SLIDE 13 Lab session.
CS 267: Automated Verification Lecture 13: Bounded Model Checking Instructor: Tevfik Bultan.
Chapter 7Louden, Programming Languages1 Chapter 7 - Control I: Expressions and Statements "Control" is the general study of the semantics of execution.
Formal Verification of SpecC Programs using Predicate Abstraction Himanshu Jain Daniel Kroening Edmund Clarke Carnegie Mellon University.
Daniel Kroening and Ofer Strichman Decision Procedure
1/25 Pointer Logic Changki PSWLAB Pointer Logic Daniel Kroening and Ofer Strichman Decision Procedure.
272: Software Engineering Fall 2012 Instructor: Tevfik Bultan Lecture 4: SMT-based Bounded Model Checking of Concurrent Software.
1 COMP 2130 Introduction to Computer Systems Computing Science Thompson Rivers University.
Security Exploiting Overflows. Introduction r See the following link for more info: operating-systems-and-applications-in-
1 Lab Session-III CSIT-120 Fall 2000 Revising Previous session Data input and output While loop Exercise Limits and Bounds Session III-B (starts on slide.
CS 11 C track: lecture 5 Last week: pointers This week: Pointer arithmetic Arrays and pointers Dynamic memory allocation The stack and the heap.
Software Engineering Prof. Dr. Bertrand Meyer March 2007 – June 2007 Chair of Software Engineering Static program checking and verification Slides: Based.
EE4E. C++ Programming Lecture 1 From C to C++. Contents Introduction Introduction Variables Variables Pointers and references Pointers and references.
IT253: Computer Organization Lecture 4: Instruction Set Architecture Tonga Institute of Higher Education.
DEPARTMENT OF COMPUTER SCIENCE & TECHNOLOGY FACULTY OF SCIENCE & TECHNOLOGY UNIVERSITY OF UWA WELLASSA 1 CST 221 OBJECT ORIENTED PROGRAMMING(OOP) ( 2 CREDITS.
1 Automatic Refinement and Vacuity Detection for Symbolic Trajectory Evaluation Orna Grumberg Technion Haifa, Israel Joint work with Rachel Tzoref.
Review C Language Features –control flow –C operators –program structure –data types –I/O and files Problem Solving Abilities.
CMPSC 16 Problem Solving with Computers I Spring 2014 Instructor: Tevfik Bultan Lecture 12: Pointers continued, C strings.
Hello.java Program Output 1 public class Hello { 2 public static void main( String [] args ) 3 { 4 System.out.println( “Hello!" ); 5 } // end method main.
Pointers OVERVIEW.
Predicate Abstraction of ANSI-C Programs Using SAT By Edmund Clarke, Daniel Kroening, Natalia Sharygina, Karen Yorav Presented by Yunho Kim Provable Software.
Parallelizing MiniSat I-Ting Angelina Lee Justin Zhang May 05, Final Project Presentation.
Introduction to Problem Solving. Steps in Programming A Very Simplified Picture –Problem Definition & Analysis – High Level Strategy for a solution –Arriving.
ECE 103 Engineering Programming Chapter 47 Dynamic Memory Alocation Herbert G. Mayer, PSU CS Status 6/4/2014 Initial content copied verbatim from ECE 103.
Author: Alex Groce, Daniel Kroening, and Flavio Lerda Computer Science Department, Carnegie Mellon University Pittsburgh, PA Source: R. Alur and.
CSV 889: Concurrent Software Verification Subodh Sharma Indian Institute of Technology Delhi Scalable Symbolic Execution: KLEE.
Model Checking C Programs Zijiang (James) Yang Department of Computer Science Western Michigan University In collaboration with NEC Laboratories America.
Computer Organization and Design Pointers, Arrays and Strings in C Montek Singh Sep 18, 2015 Lab 5 supplement.
Symbolic and Concolic Execution of Programs Information Security, CS 526 Omar Chowdhury 10/7/2015Information Security, CS 5261.
© 2006 Carnegie Mellon University Introduction to CBMC: Part 1 Software Engineering Institute Carnegie Mellon University Pittsburgh, PA Arie Gurfinkel,
Chapter 1 Java Programming Review. Introduction Java is platform-independent, meaning that you can write a program once and run it anywhere. Java programs.
Bounded Model Checking A. Biere, A. Cimatti, E. Clarke, Y. Zhu, Symbolic Model Checking without BDDs, TACAS’99 Presented by Daniel Choi Provable Software.
Error Explanation with Distance Metrics Authors: Alex Groce, Sagar Chaki, Daniel Kroening, and Ofer Strichman International Journal on Software Tools for.
1/20 Arrays Changki PSWLAB Arrays Daniel Kroening and Ofer Strichman Decision Procedure.
CMPSC 16 Problem Solving with Computers I Spring 2014 Instructor: Lucas Bang Lecture 11: Pointers.
© 2006 Carnegie Mellon University Introduction to CBMC: Part 1 Software Engineering Institute Carnegie Mellon University Pittsburgh, PA Arie Gurfinkel,
Bernd Fischer RW714: SAT/SMT-Based Bounded Model Checking of Software.
Bernd Fischer RW714: SAT/SMT-Based Bounded Model Checking of Software.
LINKED LISTS.
C++ for Engineers and Scientists Second Edition Chapter 12 Pointers.
DYNAMIC MEMORY ALLOCATION. Disadvantages of ARRAYS MEMORY ALLOCATION OF ARRAY IS STATIC: Less resource utilization. For example: If the maximum elements.
SAT for Software Model Checking Introduction to SAT-problem for newbie
Secure Coding Rules for C++ Copyright © 2016 Curt Hill
SS 2017 Software Verification Bounded Model Checking, Outlook
C Basics.
Introduction to Software Verification
Secure Coding Rules for C++ Copyright © Curt Hill
Over-Approximating Boolean Programs with Unbounded Thread Creation
NASA Secure Coding Rules
Programming Languages and Paradigms
Presentation transcript:

© 2006 Carnegie Mellon University Introduction to CBMC: Part 1 Software Engineering Institute Carnegie Mellon University Pittsburgh, PA Arie Gurfinkel, Sagar Chaki October 2, 2007 Many slides are courtesy of Daniel Kroening

2 Introduction to CBMC: Part 1 Gurfinkel, Chaki, Oct 2, 2007 © 2006 Carnegie Mellon University Bug Catching with SAT-Solvers Main Idea: Given a program and a claim use a SAT-solver to find whether there exists an execution that violates the claim. Program Claim Analysis Engine SAT Solver UNSAT (no counterexample found) SAT (counterexample exists) CNF

3 Introduction to CBMC: Part 1 Gurfinkel, Chaki, Oct 2, 2007 © 2006 Carnegie Mellon University Programs and Claims Arbitrary ANSI-C programs With bitvector arithmetic, dynamic memory, pointers, … Simple Safety Claims Array bound checks (i.e., buffer overflow) Division by zero Pointer checks (i.e., NULL pointer dereference) Arithmetic overflow User supplied assertions (i.e., assert (i > j) ) etc

4 Introduction to CBMC: Part 1 Gurfinkel, Chaki, Oct 2, 2007 © 2006 Carnegie Mellon University Why use a SAT Solver? SAT Solvers are very efficient Analysis is completely automated Analysis as good as the underlying SAT solver Allows support for many features of a programming language bitwise operations, pointer arithmetic, dynamic memory, type casts

5 Introduction to CBMC: Part 1 Gurfinkel, Chaki, Oct 2, 2007 © 2006 Carnegie Mellon University A (very) simple example (1) int x; int y=8,z=0,w=0; if (x) z = y – 1; else w = y + 1; assert (z == 7 || w == 9) int x; int y=8,z=0,w=0; if (x) z = y – 1; else w = y + 1; assert (z == 7 || w == 9) y = 8, z = x ? y – 1 : 0, w = x ? 0 :y + 1, z != 7, w != 9 y = 8, z = x ? y – 1 : 0, w = x ? 0 :y + 1, z != 7, w != 9 ProgramConstraints UNSAT no counterexample assertion always holds!

6 Introduction to CBMC: Part 1 Gurfinkel, Chaki, Oct 2, 2007 © 2006 Carnegie Mellon University A (very) simple example (2) int x; int y=8,z=0,w=0; if (x) z = y – 1; else w = y + 1; assert (z == 5 || w == 9) int x; int y=8,z=0,w=0; if (x) z = y – 1; else w = y + 1; assert (z == 5 || w == 9) y = 8, z = x ? y – 1 : 0, w = x ? 0 :y + 1, z != 5, w != 9 y = 8, z = x ? y – 1 : 0, w = x ? 0 :y + 1, z != 5, w != 9 ProgramConstraints SAT counterexample found! y = 8, x = 1, w = 0, z = 7

7 Introduction to CBMC: Part 1 Gurfinkel, Chaki, Oct 2, 2007 © 2006 Carnegie Mellon University What about loops?! SAT Solver can only explore finite length executions! Loops must be bounded (i.e., the analysis is incomplete) Program Claim Analysis Engine SAT Solver UNSAT (no counterexample of bound n is found) SAT (counterexample exists) CNF Bound (n)

8 Introduction to CBMC: Part 1 Gurfinkel, Chaki, Oct 2, 2007 © 2006 Carnegie Mellon University CBMC: C Bounded Model Checker Developed at CMU by Daniel Kroening et al. Available at: Supported platafoms: Windows (requires VisualStudio’s` CL), Linux Provides a command line and Eclipse-based interfaces Known to scale to programs with over 30K LOC Was used to find previously unknown bugs in MS Windows device drivers

9 Introduction to CBMC: Part 1 Gurfinkel, Chaki, Oct 2, 2007 © 2006 Carnegie Mellon University CBMC: Supported Language Features ANSI-C is a low level language, not meant for verification but for efficiency Complex language features, such as Bit vector operators (shifting, and, or,…) Pointers, pointer arithmetic Dynamic memory allocation: malloc/free Dynamic data types: char s[n] Side effects float / double Non-determinism

© 2006 Carnegie Mellon University DEMO

11 Introduction to CBMC: Part 1 Gurfinkel, Chaki, Oct 2, 2007 © 2006 Carnegie Mellon University Using CBMC from Command Line To see the list of claims cbmc --show-claims -I include file.c To check a single claim cbmc --unwind n --claim x –I include file.c For help cbmc --help

© 2006 Carnegie Mellon University Introduction to CBMC: Part 2 Software Engineering Institute Carnegie Mellon University Pittsburgh, PA Arie Gurfinkel, Sagar Chaki October 2, 2007 Many slides are courtesy of Daniel Kroening

13 Introduction to CBMC: Part 1 Gurfinkel, Chaki, Oct 2, 2007 © 2006 Carnegie Mellon University What about loops?! SAT Solver can only explore finite length executions! Loops must be bounded (i.e., the analysis is incomplete) Program Claim Analysis Engine SAT Solver UNSAT (no counterexample of bound n is found) SAT (counterexample exists) CNF Bound (n)

14 Introduction to CBMC: Part 1 Gurfinkel, Chaki, Oct 2, 2007 © 2006 Carnegie Mellon University How does it work Transform a programs into a set of equations 1. Simplify control flow 2. Unwind all of the loops 3. Convert into Single Static Assignment (SSA) 4. Convert into equations 5. Bit-blast 6. Solve with a SAT Solver 7. Convert SAT assignment into a counterexample

15 Introduction to CBMC: Part 1 Gurfinkel, Chaki, Oct 2, 2007 © 2006 Carnegie Mellon University Control Flow Simplifications All side effect are removal e.g., j=i++ becomes j=i;i=i+1 Control Flow is made explicit continue, break replaced by goto All loops are simplified into one form for, do while replaced by while

16 Introduction to CBMC: Part 1 Gurfinkel, Chaki, Oct 2, 2007 © 2006 Carnegie Mellon University Loop Unwinding All loops are unwound can use different unwinding bounds for different loops to check whether unwinding is sufficient special “unwinding assertion” claims are added If a program satisfies all of its claims and all unwinding assertions then it is correct! Same for backward goto jumps and recursive functions

17 Introduction to CBMC: Part 1 Gurfinkel, Chaki, Oct 2, 2007 © 2006 Carnegie Mellon University Loop Unwinding while() loops are unwound iteratively Break / continue replaced by goto void f(...) {... cond while(cond) { Body; Body; } Remainder; } void f(...) {... cond while(cond) { Body; Body; } Remainder; }

18 Introduction to CBMC: Part 1 Gurfinkel, Chaki, Oct 2, 2007 © 2006 Carnegie Mellon University Loop Unwinding while() loops are unwound iteratively Break / continue replaced by goto void f(...) {... cond if(cond) { Body; cond while(cond) { Body; Body; } Remainder; } void f(...) {... cond if(cond) { Body; cond while(cond) { Body; Body; } Remainder; }

19 Introduction to CBMC: Part 1 Gurfinkel, Chaki, Oct 2, 2007 © 2006 Carnegie Mellon University Loop Unwinding while() loops are unwound iteratively Break / continue replaced by goto void f(...) {... cond if(cond) { Body; cond if(cond) { Body; cond while(cond) { Body; Body; } Remainder; } void f(...) {... cond if(cond) { Body; cond if(cond) { Body; cond while(cond) { Body; Body; } Remainder; }

20 Introduction to CBMC: Part 1 Gurfinkel, Chaki, Oct 2, 2007 © 2006 Carnegie Mellon University Unwinding assertion while() loops are unwound iteratively Break / continue replaced by goto Assertion inserted after last iteration: violated if program runs longer than bound permits void f(...) {... cond if(cond) { Body; cond if(cond) { Body; cond if(cond) { Body; Body; cond while(cond) { Body; Body; } Remainder; } void f(...) {... cond if(cond) { Body; cond if(cond) { Body; cond if(cond) { Body; Body; cond while(cond) { Body; Body; } Remainder; }

21 Introduction to CBMC: Part 1 Gurfinkel, Chaki, Oct 2, 2007 © 2006 Carnegie Mellon University Unwinding assertion while() loops are unwound iteratively Break / continue replaced by goto Assertion inserted after last iteration: violated if program runs longer than bound permits Positive correctness result! void f(...) {... cond if(cond) { Body; cond if(cond) { Body; cond if(cond) { Body; Body; cond assert(!cond); } Remainder; } void f(...) {... cond if(cond) { Body; cond if(cond) { Body; cond if(cond) { Body; Body; cond assert(!cond); } Remainder; } Unwinding assertion

22 Introduction to CBMC: Part 1 Gurfinkel, Chaki, Oct 2, 2007 © 2006 Carnegie Mellon University Example: Sufficient Loop Unwinding void f(...) { j = 1 j <= 2 if(j <= 2) { j = j + 1; j <= 2 if(j <= 2) { j = j + 1; j <= 2 if(j <= 2) { j = j + 1; j = j + 1; (j <= 2) assert(!(j <= 2)); } Remainder; } void f(...) { j = 1 j <= 2 if(j <= 2) { j = j + 1; j <= 2 if(j <= 2) { j = j + 1; j <= 2 if(j <= 2) { j = j + 1; j = j + 1; (j <= 2) assert(!(j <= 2)); } Remainder; } void f(...) { j = 1 j <= 2 while (j <= 2) j = j + 1; Remainder; } void f(...) { j = 1 j <= 2 while (j <= 2) j = j + 1; Remainder; } unwind = 3

23 Introduction to CBMC: Part 1 Gurfinkel, Chaki, Oct 2, 2007 © 2006 Carnegie Mellon University Example: Insufficient Loop Unwinding void f(...) { j = 1 j <= 10 if(j <= 10) { j = j + 1; j <= 10 if(j <= 10) { j = j + 1; j <= 10 if(j <= 10) { j = j + 1; j = j + 1; (j <= 10) assert(!(j <= 10)); } Remainder; } void f(...) { j = 1 j <= 10 if(j <= 10) { j = j + 1; j <= 10 if(j <= 10) { j = j + 1; j <= 10 if(j <= 10) { j = j + 1; j = j + 1; (j <= 10) assert(!(j <= 10)); } Remainder; } void f(...) { j = 1 j <= 10 while (j <= 10) j = j + 1; Remainder; } void f(...) { j = 1 j <= 10 while (j <= 10) j = j + 1; Remainder; } unwind = 3

24 Introduction to CBMC: Part 1 Gurfinkel, Chaki, Oct 2, 2007 © 2006 Carnegie Mellon University Transforming Loop-Free Programs Into Equations (1) Easy to transform when every variable is only assigned once! x = a; y = x + 1; z = y – 1; x = a; y = x + 1; z = y – 1; ProgramConstraints x = a && y = x + 1 && z = y – 1 && x = a && y = x + 1 && z = y – 1 &&

25 Introduction to CBMC: Part 1 Gurfinkel, Chaki, Oct 2, 2007 © 2006 Carnegie Mellon University Transforming Loop-Free Programs Into Equations (2) When a variable is assigned multiple times, use a new variable for the RHS of each assignment ProgramSSA Program

26 Introduction to CBMC: Part 1 Gurfinkel, Chaki, Oct 2, 2007 © 2006 Carnegie Mellon University What about conditionals? ProgramSSA Program if (v) x = y; x = y;else x = z; x = z; w = x; if (v) x = y; x = y;else x = z; x = z; w = x; if (v 0 ) x 0 = y 0 ; x 0 = y 0 ;else x 1 = z 0 ; x 1 = z 0 ; w 1 = x?? ; if (v 0 ) x 0 = y 0 ; x 0 = y 0 ;else x 1 = z 0 ; x 1 = z 0 ; w 1 = x?? ; What should ‘x’ be?

27 Introduction to CBMC: Part 1 Gurfinkel, Chaki, Oct 2, 2007 © 2006 Carnegie Mellon University What about conditionals? For each join point, add new variables with selectors ProgramSSA Program if (v) x = y; x = y;else x = z; x = z; w = x; if (v) x = y; x = y;else x = z; x = z; w = x; if (v 0 ) x 0 = y 0; x 0 = y 0;else x 1 = z 0; x 1 = z 0; x 2 = v 0 ? x 0 : x 1 ; w 1 = x 2 if (v 0 ) x 0 = y 0; x 0 = y 0;else x 1 = z 0; x 1 = z 0; x 2 = v 0 ? x 0 : x 1 ; w 1 = x 2

28 Introduction to CBMC: Part 1 Gurfinkel, Chaki, Oct 2, 2007 © 2006 Carnegie Mellon University Adding Unbounded Arrays Arrays are updated “whole array” at a time A[1] = 5; A[2] = 10; A[k] = 20; A 1 =λ i : i == 1 ? 5 : A 0 [i] A 2 =λ i : i == 2 ? 10 : A 1 [i] A 3 =λ i : i == k ? 20 : A 2 [i] Examples: A 2 [2] == 10A 2 [1]==5A 2 [3] == A 0 [3] A 3 [2] == (k==2 ? 20 : 10) Uses only as much space as there are uses of the array!

29 Introduction to CBMC: Part 1 Gurfinkel, Chaki, Oct 2, 2007 © 2006 Carnegie Mellon University Example

30 Introduction to CBMC: Part 1 Gurfinkel, Chaki, Oct 2, 2007 © 2006 Carnegie Mellon University Pointers While unwinding, record right hand side of assignments to pointers This results in very precise points-to information Separate for each pointer Separate for each instance of each program location Dereferencing operations are expanded into case-split on pointer object (not: offset) Generate assertions on offset and on type Pointer data type assumed to be part of bit-vector logic Consists of pair

31 Introduction to CBMC: Part 1 Gurfinkel, Chaki, Oct 2, 2007 © 2006 Carnegie Mellon University Pointer Typecast Example void *p; int i; int c; int main (void) { int input1, intput2, z; int input1, intput2, z; p = input1 ? (void*)&i : (void*) &c; p = input1 ? (void*)&i : (void*) &c; if (input2) if (input2) z = *(int*)p; z = *(int*)p; else else z = *(char*)p; } z = *(char*)p; } void *p; int i; int c; int main (void) { int input1, intput2, z; int input1, intput2, z; p = input1 ? (void*)&i : (void*) &c; p = input1 ? (void*)&i : (void*) &c; if (input2) if (input2) z = *(int*)p; z = *(int*)p; else else z = *(char*)p; } z = *(char*)p; }

32 Introduction to CBMC: Part 1 Gurfinkel, Chaki, Oct 2, 2007 © 2006 Carnegie Mellon University Dynamic Objects Dynamic Objects: malloc / free Local variables of functions Auxiliary variables for each dynamically allocated object: Size (number of elements) Active bit Type malloc sets size (from parameter) and sets active bit free asserts that active bit is set and clears bit Same for local variables: active bit is cleared upon leaving the function

33 Introduction to CBMC: Part 1 Gurfinkel, Chaki, Oct 2, 2007 © 2006 Carnegie Mellon University Deciding Bit-Vector Logic with SAT Pro: all operators modeled with their precise semantics Arithmetic operators are flattened into circuits Not efficient for multiplication, division Fixed-point for float / double Unbounded arrays Use uninterpreted functions to reduce to equality logic Similar implementation in UCLID But: Contents of array are interpreted Problem: SAT solver happy with first satisfying assignment that is found. Might not look nice.

34 Introduction to CBMC: Part 1 Gurfinkel, Chaki, Oct 2, 2007 © 2006 Carnegie Mellon University Example CBMC void f (int a, int b, int c) { int temp; if (a > b) { temp = a; a = b; b = temp; } if (b > c) { temp = b; b = c; c = temp; } if (a < b) { temp = a; a = b; b = temp; } assert (a<=b && b<=c); } State 1-3 a=-8193 ( ) b=-402 ( ) c= ( …) temp=0 ( ) State 4 file sort.c line 10 temp=-402 ( ) State 5 file sort.c line 11 b= ( …) State 6 file sort.c line 12 c=-402 ( ) Failed assertion: assertion file sort.c line 19

35 Introduction to CBMC: Part 1 Gurfinkel, Chaki, Oct 2, 2007 © 2006 Carnegie Mellon University Problem (I) Reason: SAT solver performs DPLL backtracking search Very first satisfying assignment that is found is reported Strange values artifact from bit-level encoding Hard to read Would like nicer values

36 Introduction to CBMC: Part 1 Gurfinkel, Chaki, Oct 2, 2007 © 2006 Carnegie Mellon University Problem (II) Might not get shortest counterexample! Not all statements that are in the formula actually get executed There is a variable for each statement that decides if it is executed or not (conjunction of if -guards) Counterexample trace only contains assignments that are actually executed The SAT solver picks some…

37 Introduction to CBMC: Part 1 Gurfinkel, Chaki, Oct 2, 2007 © 2006 Carnegie Mellon University Example void f (int a, int b, int c) { if(a) { a=0; b=1; } assert(c); } CBMC {-1} b_1#2 == (a_1#0?b_1#1:b_1#0) {-2} a_1#2 == (a_1#0?a_1#1:a_1#0) {-3} b_1#1 == 1 {-4} a_1#1 == 0 {-5} \guard#1 == a_1#0 {-6} \guard#0 == TRUE | {1} c_1#0 assign- ments from SSA

38 Introduction to CBMC: Part 1 Gurfinkel, Chaki, Oct 2, 2007 © 2006 Carnegie Mellon University Example void f (int a, int b, int c) { if(a) { a=0; b=1; } assert(c); } State 1-3 a=1 ( ) b=0 ( ) c=0 ( ) State 4 file length.c line 5 a=0 ( ) State 5 file length.c line 6 b=1 ( ) Failed assertion: assertion file length.c line 11 CBMC

39 Introduction to CBMC: Part 1 Gurfinkel, Chaki, Oct 2, 2007 © 2006 Carnegie Mellon University Basic Solution Counterexample length typically considered to be most important e.g., SPIN iteratively searches for shorter counterexamples Phase one: Minimize length l g : Truth value (0/1) of guard, l w : Weight = number of assignments Phase two: Minimize values

40 Introduction to CBMC: Part 1 Gurfinkel, Chaki, Oct 2, 2007 © 2006 Carnegie Mellon University Pseudo Boolean Solver (PBS) Input: CNF constraints Pseudo Boolean constraints — 2x + 3y + 6z <= 7, where x, y, z are Boolean variables Pseudo Boolean objective function Output: Decision (SAT/UNSAT) Optimizatioin (Minimize/Maximize an objective function) Some implementations: PBS MiniSat+ (from MiniSat web page)

41 Introduction to CBMC: Part 1 Gurfinkel, Chaki, Oct 2, 2007 © 2006 Carnegie Mellon University Example void f (int a, int b, int c) { int temp; if (a > b) { temp = a; a = b; b = temp; } if (b > c) { temp = b; b = c; c = temp; } if (a < b) { temp = a; a = b; b = temp; } assert (a<=b && b<=c); } State 1-3 a=0 ( ) b=0 ( ) c=-1 ( ) temp=0 ( ) State 4 file sort.c line 10 temp=0 ( ) State 5 file sort.c line 11 b=-1 ( ) State 6 file sort.c line 12 c=0 ( ) Failed assertion: assertion file sort.c line 19 CBMC + + Mini- mization

42 Introduction to CBMC: Part 1 Gurfinkel, Chaki, Oct 2, 2007 © 2006 Carnegie Mellon University Modeling with CBMC (1) CBMC provides 2 modeling (not in ANSI-C) primitives xxx nondet_xxx () xxx Returns a non-deterministic value of type xxx int nondet_int (); char nondet_char (); Useful for modeling external input, unknown environment, library functions, etc.

43 Introduction to CBMC: Part 1 Gurfinkel, Chaki, Oct 2, 2007 © 2006 Carnegie Mellon University Using nondet for modeling Library spec: “foo is given non-deterministically, but is taken until returned” CMBC stub: int nondet_int (); int is_foo_taken = 0; int grab_foo () { if (!is_foo_taken) if (!is_foo_taken) is_foo_taken = nondet_int (); is_foo_taken = nondet_int (); return is_foo_taken; } return is_foo_taken; } int nondet_int (); int is_foo_taken = 0; int grab_foo () { if (!is_foo_taken) if (!is_foo_taken) is_foo_taken = nondet_int (); is_foo_taken = nondet_int (); return is_foo_taken; } return is_foo_taken; } int return_foo () { is_foo_taken = 0; } int return_foo () { is_foo_taken = 0; }

44 Introduction to CBMC: Part 1 Gurfinkel, Chaki, Oct 2, 2007 © 2006 Carnegie Mellon University Modeling with CBMC (2) The other modeling primitive __CPROVER_assume (expr) If the expr is fasle abort the program, otherwise continue executing __CPROVER_assume (x>0 && y <= 10);

45 Introduction to CBMC: Part 1 Gurfinkel, Chaki, Oct 2, 2007 © 2006 Carnegie Mellon University Assume-Guarantee Reasoning (1) foo Is foo correct? int foo (int* p) { … } void main(void) { … foo(x); foo(x); … foo(y); foo(y); …} int foo (int* p) { … } void main(void) { … foo(x); foo(x); … foo(y); foo(y); …} Check by splitting on the argument of foo

46 Introduction to CBMC: Part 1 Gurfinkel, Chaki, Oct 2, 2007 © 2006 Carnegie Mellon University Assume-Guarantee Reasoning (2) foo (A) Is foo correct assuming p is not NULL? int foo (int* p) { __CPROVER_assume(p!=NULL); … } foo (G)Is foo guaranteed to be called with a non-NULL argument? void main(void) { … assert (x!=NULL);// foo(x); assert (x!=NULL);// foo(x); … assert (y!=NULL); //foo(y); assert (y!=NULL); //foo(y); …} …} void main(void) { … assert (x!=NULL);// foo(x); assert (x!=NULL);// foo(x); … assert (y!=NULL); //foo(y); assert (y!=NULL); //foo(y); …} …}

47 Introduction to CBMC: Part 1 Gurfinkel, Chaki, Oct 2, 2007 © 2006 Carnegie Mellon University Dangers of unrestricted assumptions Assumptions can lead to vacuous satisfaction if (x > 0) { __CPROVER_assume (x < 0); __CPROVER_assume (x < 0); assert (0); } assert (0); } if (x > 0) { __CPROVER_assume (x < 0); __CPROVER_assume (x < 0); assert (0); } assert (0); } This program is passed by CMBMC! Assume must either be checked with assert or used as an idiom: x = nondet_int (); y = nondet_int (); __CPROVER_assume (x < y); x = nondet_int (); y = nondet_int (); __CPROVER_assume (x < y);

48 Introduction to CBMC: Part 1 Gurfinkel, Chaki, Oct 2, 2007 © 2006 Carnegie Mellon University Checking user-specified claims Assert, assume, and non-determinism + Programming can be used to specify many interesting claims dir=1; while (x>0) { x = x + dir; if (x>10) dir = -1*dir; if (x>10) dir = -1*dir; if (x<5) dir = -1*dir; if (x<5) dir = -1*dir;}dir=1; while (x>0) { x = x + dir; if (x>10) dir = -1*dir; if (x>10) dir = -1*dir; if (x<5) dir = -1*dir; if (x<5) dir = -1*dir;} How to use CBMC to check whether the loop has an infinite execution?

49 Introduction to CBMC: Part 1 Gurfinkel, Chaki, Oct 2, 2007 © 2006 Carnegie Mellon University