Home
PDF version
Contents
1. and the number of refinements required to prove the property Error Traces Now consider an erroneous version of the same program where the programmer swaps the variables x and y in the subtraction include lt assert h gt int foo int x int y if x gt y x y Xx assert x gt 0 Make the above change in the file tut c and then do gcc E I BLASTHOME test headers tuti c gt tuti i This time BLAST comes back and says that an error is found and moves to a pane where the error trace is shown in the middle Size 5 4 4 Pred x foo gt y foo 5 Babe Block x foo y foo x foo 6 6 6 Pred Not x foo gt 0 6 6 6 FunctionCall __assert foo c 6 x gt 0 1 The size parameter gives the length of the error trace The numbers on the left give the line numbers in the source code for the corresponding program actions Notice that the statement assert x gt 0 of the source code is expanded to the two actions 6 6 Pred Not x foo gt 0 6 6 6 FunctionCall __assert foo c 6 x gt 0 1 that checks the asserted invariant and calls __assert if the invariant fails Exercise 1 Assertions are also used to specify unreachable code for example at the end of an infinite server loop Consider the simple example main int x y x 0 y 0 while x y xt ytt assert 0 Check that BLAST finds that the assert is indeed unreachable note that
2. actual code Currently the same pattern variable may only appear multiple times in a single pattern to match the same C variable used in multiple places Patterns may also contain an additional special sequence In most positions this sequence acts just like a pattern variable except that matching expressions are not bound in guards actions or repairs It has two additional special functions A pattern like function_call some args matches a function call matching the given function call pattern regardless of whether or not the result is saved in a variable discarding the destination variable if it is present may be given as the last actual parameter in a function call to match all remaining parameters zero or more Patterns are only matched against straight line code within basic blocks Both patterns and C source files are compiled to the Cil intermediate language before matching In this form the only valid statements are 1 assignments of side effect free expressions to variables and 2 function calls optionally saving the return value to variable guard action and repair The guard directive is followed by a C expression possibly with pattern variables inside braces action and repair are followed by sequences of C statements possibly with pattern variables inside braces These directives specify the checks to be made and actions to be taken at certain points during execution relative to a match of a given pattern
3. example running spec opt myspec spc myfile c will produce instrumented c and instrumented pred in the current directory You can then feed this file into BLAST for verification There is no need to tell BLAST the error label since the generated file uses the default label For example you could check the output by running pblast opt bddcov nofp predH 6 block pred instrumented pred instrumented c There are other ways to invoke spec opt Running spec opt myspec spc myfilel c myfile2 c myfile3 c merges all of the specified C sources into a checkable instrumented c spec opt myspec spc merges all C sources in the current directory except instrumented c if it exists into a checkable instrumented c 4 2 Example specification files 4 2 1 A global lock include lt locking_functions h gt global int locked 0 event pattern init action locked 0 event pattern lock guard locked 0 10 action locked 1 event pattern unlock guard locked 1 action locked 0 This specification models correct usage of abstract global locking functions A global variable is created to track the status of the lock Simple events match calls to the relevant functions The event for init initializes the global variable The other two events ensure that the lock is in the right state before making a function call When these checks succeed the global variabl
4. in textual form in LF syntax These can be read and encoded by a standard PCC proof encoder pf Generate proof tree in the file foo tree pfgen Spit out vampyre proofs Always use this the other option is buggy pffile xxx File to write vampyre proofs If no file is specified proofs are written to tmp 1f pfs Old Heuristics that are no longer used supported You can omit reading about the options in this section These pertain to several heuristics in the older version The default is set to the heuristic that we found to work best Many of the following heuristics are no longer supported comp xxx This implements the keep_subtree heuristic from the Lazy Abstraction paper The options are cut to remove the subtree and path to keep the subtree We found that path was nominally faster but went into loops very often So the default is set to cut post xxx The algorithms to compute post The options are slam for an approximate Cartesian post as implemented in SLAM and H for the most precise predicate abstraction We saw that slam post is vastly more efficient yet is precise enough to prove properties of interest The default is slam forget This option naively forgets predicates found when it backtracks out of a subtree This repeats work the next time the same part of the program is visited the same predicates are found again The default is not to forget dc Some don t care heuristic for predicates not in scope Deprecat
5. move to the next and previous operation Undo Redo The second pair are like web browser buttons in that they move to the previous or next operation among the various operations that have been hitherto selected FF REW The third pair move to the next or previous point in the trace where the values of the predicates are different from the present values thus they skip over irrelevant operations and proceed directly to the nearest operation that changes the values of the predicates Pred Change The fourth pair are used after first selecting some predicate in the rightmost pane after selecting the predicate if one clicks the right left button one is taken to the first operation in the future past where the value of that predicate is about to has just change d This pair is used to see which operations cause a predicate to get its value at some point in the trace 7 Modeling Heuristics 7 1 Nondeterministic Choice BLAST uses the special variable __BLAST_NONDET to implement nondeterministic choice Thus 17 if __BLAST_NONDET then branch else else branch is treated as a nondeterministic if statement whose either branch may be taken This is sometimes useful in modeling nondeterministic choice in specification functions or in models of library functions 7 2 Stubs and Drivers BLAST is essentially a whole program analysis If there are calls in your code to library functions it expects to see the body of th
6. view the various operations and convince yourself that this is indeed a violation of the specification 3 4 Additional Predicates Now consider the following example void main int x y int __BLAST_NONDET x 0 y 0 while __BLAST_NONDET x 5 Ve PS while x gt 0 x77 3 Ya assert y 0 The variable _BLAST_NONDET has special internal meaning it is treated as a nondeterministic choice This is often useful to model nondeterministic behavior for stub functions If you run BLAST on this ex ample after processing with gcc and mfilter it fails with the error message No new predicates found This is because the predicate discovery engine of BLAST is not powerful to infer the predicates x y x gt 0 from this example In such a case the user can give additional useful predicates to BLAST Additional predicates can be given using a predicate file A predicate file contains a list of useful predicates separated by semicolons that BLAST reads in at the start of the model checking Each predicate is an atomic predicate written in C syntax but where the local variable x in function f is written as x f global variables y are still written y In this example we can create a file tut3 pred with the single entry x main y main x main gt 0 the semicolons are necessary We then run BLAST after selecting the file tut3 pred as a predicate file and this time it reports that the program is safe Methods to auto
7. without creating type errors For example a type that has values used as 12 parameters to arithmetic operators or that have struct members projected from them is not abstract Abstract types will generally arise when dealing with libraries whose source is not available or that you choose to treat as black boxes A type is shadowed by a directive consisting of the keyword shadow followed by the name of the type to be shadowed and then a C style struct definition consisting of a set of field definitions inside braces The difference from C field definitions is that each field must have a starting value defined in the same manner in which you would define an initial value for a global variable Note The initializers are not used in the current implementation 4 3 4 Events Events are used to change global state and verify properties based on the execution of a C program An event directive consists of the keyword event followed by a sequence of sub directives within braces pattern Patterns specify which possible program statements activate an event Following the pattern keyword is a sequence of C statements enclosed in braces These statements may have pattern variables in some positions where expressions belong A pattern variable is the character followed by a positive integer An event will be activated for any sequence of statements that matches the pattern sequence for that event with pattern variables matching any expressions in the
8. you wish to install and use this tool for theorem prover calls Again this involves putting the executable for Cvc in the bin directory Note that in order for BLAST to use Simplify or Cvc the executable for Simplify and Cvc must be in your current path It is a good idea to add the BLAST bin directory to your path BLAST can also use any other SMT LIB compatible theorem prover for its satisfiability queries cf notes 6 BLAST also comes with an independent GUI In order to install the GUI you must download and install the LablIGTK package in addition to Ocaml After you have installed LablGTK you can build the GUI by going to the blast 2 4 directory and typing make gui This will create the GUI executable blastgui opt in the directory bin 7 BLAST actually the GUI requires the use of the environment variable BLASTHOME Therefore you should set the environment variable BLASTHOME to point to the directory blast 2 4 blast where you have downloaded BLAST 8 Congratulations You can now start using BLAST 3 A Tutorial Introduction to BLAST In this section we show how BLAST can be used to check safety properties of C code We shall discuss how to specify safety properties in the BLAST specification language and the various options that BLAST takes to check C code against the specification BLAST can be run both from the command line and from a GUI 3 1 Reachability Checking The simplest way to write a program that BLAST should c
9. BLAST September 16 2008 1 Introduction Bast Berkeley Lazy Abstraction Software verification Tool is an automatic verification tool for checking temporal safety properties of C programs Given a C program and a temporal safety property BLAST either statically proves that the program satisfies the safety property or provides an execution path that exhibits a violation of the property or since the problem is undecidable does not terminate BLAST constructs explores and refines abstractions of the program state space based on lazy predicate abstraction and interpolation based predicate discovery The concepts of BLAST are described in D Beyer T A Henzinger Ranjit Jhala and Rupak Majumdar The Software Model Checker BLAST Applications to Software Engineering Int Journal on Software Tools for Technology Transfer 2007 Online BLAST is relatively independent of the underlying machine and operating system However we have only tested it on Intel Pentium processors under Linux and Microsft Windows with Cygwin Other operating systems for the processors above have not been tested but the code may work under other operating systems with little work BLAST is free software released under the Modified BSD license A of this document is also available 2 Download and Installation BLAST can be downloaded from BLAST s download web page 2 1 Downloading Binaries You can download executable versions of BLAST for Linux and Windo
10. CIL e An index of all types e An index of all values 10 Known Limitations 1 The current release does not support function pointers With the flag nofp set you can disregard all function pointer calls The correctness of the analysis is then modulo the assumption that function pointer calls are irrelevant to the property being checked 2 Recursive functions Currently BLAST inlines function calls This means that it loops on recursive calls This is a big limitation on the files that can be analyzed The option cf implements context free reachability However it has not been tested 3 There are several bugs in the options craig 1 2 If craig should fail we suggest you run BLAST without this option and check 11 Authors BLAST was developed by Adam Chlipala Tom Henzinger Ranjit Jhala Rupak Majumdar and with contributions from among others Yinghua Li Ken McMillan Shaz Qadeer and Westley Weimer 12 Troubleshooting 1 BLAST fails with Failure Simplify raised exception End_of_file Is Simplify in your path 2 BLAST fails with Failure convertExp This expression Eq should not be handled here BLAST does not like expressions like return x y Change this to if x y return 1 else return 0 Similarly change a x y to if x y a 1 else a 0 and similarly for the other relational operators lt gt gt lt Don t see your problem Send mail to blast ic eecs b
11. If the guard expression is true with the matching expressions substituted for corresponding pattern variables then the specified action code is run with the same pattern variable substitutions If the guard expression is false and a repair has been specified then those instructions are run with substitutions If the guard is false and no repair is specified then an error is signalled by calling the _error__ function Actions and repairs may also call the error function manually These directives are all optional The default guard is an always true expression The default action is empty and omitting repair causes an error to be signalled when the guard is false When an event is meant to update global state without verifying a program invariant it is helpful to specify an empty repair to avoid signalling an error based on conditions used to determine how to change the state before and after These directives take no additional parameters and specify whether to check the guard and perform the appropriate action repair or _ error__ call before or after the execution of a matching sequence of statements respectively If neither directive is given then before is taken to be present implicitly 13 5 Using BLAST User Options The following command line options are useful for running BLAST see pblast opt help for a complete list Model Checking Options The following options are available to customize the model checking run mai
12. Note however that the option craig uses Vampyre internally See the programmer s documentation to see how to add your own decision procedure We recommend the use of Simplify as default as it is considerably faster than Vampyre nocache Do not cache theorem prover calls This makes the run require less memory cov With the option cov check for coverability is done only for control flow nodes that have back pointers reclaim A space saving heuristic does not keep whole tree around during the model checking reclaims tree nodes on backtrack ax xxx Specify a set of additional axioms for Simplify The axioms file is passed to Simplify Simplify requires that the file ends in ax So to pass the axiom file file ax say ax file It is assumed that the axiom file is in the same directory from which BLAST is invoked alias xxx Alias analysis options If the option xxx is bdd invokes a bdd based alias analysis oth erwise reads the alias relationships from the file xxx Additionally the option pta flow noflow specifies a mode for points to analysis noflow runs a flow insensitive version flow a flow sensitive version This version of BLAST only supports noflow If this option is omitted then no alias analysis is performed and BLAST makes the assumption that lvalues are not aliased The option scheck then performs some checks to ensure that this assumption is met However it can happen that the analysis is unsound even
13. add the observer variable int lockStatus that tracks the current state of the global lock locked or unlocked and update lockStatus to 1 for locked whenever FSMLock is called and update lockStatus to 0 for unlocked whenever FSMUnLock is called We also initialize lockStatus to 0 in the call to FSMInit Finally we add the assertion assert lockStatus 0 in the beginning of FSMLock to say that the lock is not held and the assertion assert lockStatus 1 in the beginning of FSMUnLock to say that the lock is held Then the instrumented program satisfies our property iff the assertions are never violated The problem with this instrumentation is that it is specific for this code and tedious to do manually Therefore BLAST comes with a specification language where safety properties can be specified at a higher level The specification is automatically compiled into an instrumented program with assertions as above For our safe locking property we write the property as follows in a file called lock spc global int lockStatus 0 event pattern FSMInit action lockStatus 0 event pattern FSMLock guard lockStatus 0 action lockStatus 1 event pattern FSMUnLock guard lockStatus 1 action lockStatus 0 We give an intuitive description of the specification The next section gives a detailed account of the spec ification language The declaration global int lockS
14. all variables occurring in conditionals are important and propagates this to find all useful assignments Further the constant propagation algorithm is implemented see also pe depth k Unroll CFA to depth k This is experimental and not included in the release Parallel Model Checking and Races BLAST implements a Thread modular algorithm for checking races in multithreaded C programs These options relate to the algorithm for checking races checkRace Invoke the TAR algorithm to check for races on shared variable accesses par Use data structures for parallel BLAST Not supported 15 Saved Abstractions and Summarization These options are used to save and load abstractions from a BLAST run loadabs When BLAST is run with the file fname c it continuously outputs the abstraction used in the model checking into the file fname abs The loadabs option can be used to read back the abstraction file created in a previous run This makes subsequent runs faster and is useful for regression testing This option also allows us to run BLAST with the abstraction generated from an interrupted run e interface f Specify name of a function to take as describing a component interface Not supported in this release component f Specify name of a function to check for satisfying the interface Not supported in this release Proof generation options BLAST implements a set of options to generate PCC style proofs The proofs are output
15. assert 0 always fails 3 3 Temporal Safety Specifications Assertions are a particularly simple and local way to specify program correctness More generally we are interested in temporal safety properties where we wish to check that our program satisfies some finite state property For example we might wish to check that a program manipulating locks acquires and releases locks in strict alternation that is two calls to lock without a call to unlock in the middle is an error and vice versa More generally we wish to check safety properties concerning the proper sequencing of program events Let us be concrete Consider the following program that manipulates locks in the file tut2 c int STATUS_SUCCESS 0 int STATUS_UNSUCCESSFUL 1 struct Irp int Status int Information 3 struct Requests int Status struct Irp irp struct Requests Next struct Device struct Requests WriteListHeadVa int writeListLock 3 void FSMInit code to initialize the global lock to unlocked state void FSMLock code for acquiring the lock void FSMUnLock code for releasing the lock void SmartDevFreeBlock struct Requests r code omitted for simplicity void IoCompleteRequest struct Irp irp int status code omitted for simplicity struct Device devE void main int IO_NO_INCREMENT 3 int nPacketsOld nPackets struct Requests request struct Irp i
16. e function If the body of a function is not present BLAST optimistically assumes that the function has no effect on the variables of the program other than the one in which the return value is copied Sometimes we are interested in the effect of library functions but not in their detailed implemen tation For example we may be interested in knowing that malloc returns either a null pointer or a non null pointer without knowing exactly how memory allocation works This is useful for scalability we are abstracting unnecessary details of the library Sometimes this is necessary as well certain system services are written in assembly and not amenable to our analysis BLAST expects in these cases that the user provides stubs for useful library functions Each stub function is basically a piece of C code possibly with the use of _BLAST_NONDET to allow nondeterministic choice 7 3 Syntax of Seed Predicates You can input initial predicates on the command line using the option pred This section gives the syntax for input predicates The format of the predicate file is a list of predicates separated by semi colons Each predicate is a valid boolean expression in C syntax However we change variable names to also reflect the scope of the variable So the variable x in function foo is written x foo The detailed syntax can be seen in the file inputparse mly in the directory psrc Notice that if the same syntactic name is used for multiple variables i
17. e is updated and execution proceeds When they fail an error is signalled Pattern matching is performed in an intermediate language where code is broken down into sequences of function calls and assignments The s above match either a variable to which the result of a function call is assigned or the absence of such an assignment thus making the patterns cover all possible calls to the functions 4 2 2 Simplified seteuid and system include lt sys types h gt include lt unistd h gt include lt pwd h gt include lt stdlib h gt global int __E__ 0 event pattern seteuid 1 action _E__ 1 event pattern system guard _E__ 0 This specification models the requirement that a setuid program should not call the system function until it has changed the effective uid to a nonzero value The 1 in the seteuid patterns will match any parameter including the result of a complicated series of function calls Here is used as a function parameter to match all remaining actual parameters 4 2 3 X11 parameter consistency checking For the sake of this example we consider types and functions similar to those found in an X11 windowing system API typedef struct context Context typedef struct image Image typedef struct display Display Display newDisplay void Context genContext Display 11 Image genImage Display int void putText Display Context Image W
18. e now define a specification file to verify the property that the Context and Image passed to putText both belong to the Display that is passed include xii h shadow Image Display display 0 shadow Context Display display 0 event after pattern 1 genContext 2 action 1 gt display 2 event after pattern 1 genImage 2 3 action 1 gt display 2 event pattern putText 1 2 3 guard 2 gt display 3 gt display amp amp 2 gt display 1 4 3 Informal description of syntax A specification spc file consists of a sequence of the following kinds of directives 4 3 1 Includes These are verbatim C style include directives You should include the necessary header files to support all of the code contained in the specification For example functions used should be prototyped in some header file that is included 4 3 2 Global variables These are C style definitions of single variables with initializers prefaced by the keyword global For example global int flag 10 Each directive creates a global variable to which the other parts of the specification may refer 4 3 3 Shadowed types It is possible to replace abstract types with structures storing information pertinent to properties to be checked Here an abstract type is a type used in the code to be checked in such a way that it could be replaced by any other type
19. ed Do not use see craig instead General Options The following options let the user select different configurations mostly for de bugging debug Prints out copious debugging information cfa dot xxx Output the CFA of every function in ATT dot format in the file xxx stop Stop when the model checker hits the first possibly invalid counterexample Useful for debugging traces Every time a false counterexample is encountered the trace itself is dumped Used for diagnostic purposes With the option tracefile xxx you can additionally specify the name of the file containing trace information This is used by the trace viewer 16 e demo Run in demo mode for the GUI e xml Generate error traces as a bunch of xml files that can be read in and displayed by SLAM s GUL e help or help Display the list of options 6 Graphical User Interface BLASTcomes with a rudimentary whose chief purpose is to make it easier to view counterexample traces In this section we discuss the GUI The GUI is started by the command blastgui opt Source and predicate files are loaded in using File in the main toolbar or by entering the filenames in the appropriate text boxes and clicking the load button There are four sub panes showing respectively a log of events the source file the predicate file and counterexample traces To run BLAST the user must first select the source file and then optionally a predicate file and then type
20. erkeley edu 21 13 Bug reports If you find one please send email to BLAST at We are certain that there are still bugs in BLAST blast ic eecs berkeley edu or to Rupak Majumdar or Ranjit Jhala 14 Changes 22
21. es the program correct 4 Consider the following variant of main void main int i j int vi v2 i malloc A4 j malloc 4 xi vi swapi i i assert i vi Does the assertion hold What happens if you replace swap1 with swap2 Run BLAST and verify in each case 9 Programmer s Manual 9 1 Architecture of BLAST BLAST uses the CIL infrastructure as the front end to read in C programs The programs are internally represented as control flow automata implemented in module CFA Sets of states are represented by the Region data structure The Region module represents sets of states as boolean formulas over a set of base predicates and allows boolean operations on regions and checks for emptiness and inclusion The Abstraction functor takes the Region module and the CFA module providing in addition concrete and abstract pre and post operations and methods to analyze counterexamples Using the Abstrac tion module the LazyAbstraction functor implements the model checking algorithm at a high level of abstraction BLAST uses the and the as underlying decision procedures Boolean formula manipulations are done using the Colorado University Decision Diagram package 20 9 2 API Documentation The architecture of BLAST is described in the file src blastArch ml We also have an online documen tation extracted from the code We index below the main types that are used to represent C programs in
22. example analysis You can still use the old counterexample analysis by running noblock With the old analysis you can also specify the direction of the analysis with the flag refine fwd bwd that runs the analysis forwards or backwards according to the option provided predH k Perform predicate discovery heuristics There are several levels we recommend using level k 7 The heuristics include checking all causes of unsatisfiability and adding additional predicates based on the syntax tsd zig Set trace search direction zig goes zigzagging restarts from the end craig 1 2 Use craig interpolants FOCI to get predicates 1 use with scope 2 maintains local tables of predicates See the paper Abstractions from Proofs by T A Henzinger R Jhala R Majumdar and K L McMillan craig internally uses the block based counterexample analysis i e automatically sets block See also scope scope Remove predicates not in scope This should be run with craig 1 otherwise this fails Program Optimization Options BLAST implements a set of program analysis routines that can make the analysis run significantly faster These can be turned on or off with the following options pe Implements an aggressive interprocedural constant propagation algorithm O x Turn program optimizations on or off The levels are 0 1 The default is 0 off In level 1 a cone of influence optimization is implemented It assumes
23. heck is to specify a C label at a program location that must not be reached The model checker BLAST checks whether such a label in the C source code is reachable The basic command for running BLAST is pblast opt prog c main start L errlabel This runs the model checker on the program prog c and checks for reachability of the error label errlabel starting from the initial location of function start The run ends with either an error trace or with a message that the error was unreachable or since the reachability problem is undecidable the program may not terminate The defaults for start and errlabel are main and ERROR respectively Therefore invoking BLAST with pblast opt prog c checks whether the program label ERROR is reachable when execution begins in the function main Consider the following C program int main int x y if x gt y x x y if x lt 0 ERROR goto ERROR J Any other safety property can be transformed to reachability checking by program instrumentation For example more sophisticated specifications are instrumented into the code by preprocessing step such that failure of the specification amounts to reaching a particular error label This also means that you can add your own annotations directly to the code and have a special error label to signify violation of the property you are checking 3 2 Assertion Checking The most convenient form of safety properties are assertions that specify in
24. in the options in the text pane labelled options and click the Run button If the system is free of errors BLASTwill hopefully pop up a window saying so if not it will hopefully switch to the counterexample trace pane showing a counterexample that violates the specification We say hopefully as it is possible as we saw before that BLASTwill be be stuck at some point unable to find the right predicates to continue In this case also the GUI moves to the counterexample trace pane which now shows a trace on which BLASTis stuck the user can then stare at the trace and guess some predicates which can then be fed to BLAST The Counterexample Trace Pane The counterexample trace pane is broken into 3 subpanes the leftmost is the program source the middle pane is the sequence of operations that is the counterexample and the rightmost pane contains the state of the system given by values for the various predicates in the top half and the function call stack in the lower pane at the corresponding points in the counterexample One can see the state of the system at different points of the trace by clicking on the corresponding operation in the middle pane When one chooses an operation in the middle pane the corresponding program text is highlighted in the left pane and the predicate values and control stack are shown in the right pane Alternatively one can go back and forth along the trace using the arrows along the bottom FW BK The first pair
25. infunction is the name of the starting function and ErrorLabel is an error label The default for mainfuntion is main and ErrorLabel is ERROR so e g if you are checking a program starting from main and checking reachability of the label ERROR you can just write pblast opt filename In our case the filename is tut1 i and the start function is foo the assertion check automatically introduces an error label ERROR So we invoke BLAST with pblast opt tuti i main foo make sure Simplify is in your path BLAST comes back and reports that the system is safe i e the assertion is not violated Running BLAST from the GUI First at the command prompt type blastgui opt after making sure that that file is in your path First we must load the file foo i this is done by clicking on File and then selecting Load Source and then selecting the file tut1 i Next to run BLAST on this file in the text pane labelled Command type main foo and then click the button labelled Run The text written into the command pane is the options that BLAST is run with main foo tells BLAST to start the analysis from the function called foo Quickly the tool pops up a window that states that the system is safe meaning the asserts never fail In the pane labelled Log BLAST prints out the predicates that it learns and uses to prove the property When the model checking is finished it comes with other statistics related to the analysis the number of iterations
26. inters Code with function pointer calls therefore cause BLAST to fail with an exception unless the flag nofp is used in which case all function pointer calls are ignored The option alias is used to provide aliasing information to BLAST The option takes a string argument If the argument is bdd then the BDD based Andersen s analysis is run If it is some other string then BLAST assumes that the string indicates a filename where aliasing relationships are given If the alias option is omitted BLAST makes the unsound assumption that there are no aliases in the program Exercise 3 Consider the program include lt assert h gt int __BLAST_NONDET void swapi int a int b int tmp a xa b b tmp void malloc int k void main int i j int vi v2 i malloc 4 j malloc 4 xi vi j v2 swap1 i j swap1 i j assert i v1 amp amp j v2 1 Run BLAST with pblast opt foo i craig 1 predH 7 There is an error trace because BLAST does not consider the aliasing among the variables Now run BLASTwith 19 pblast opt alias bdd cref foo i craig 1 predH 7 BLAST says that the system is safe 2 Now comment out the second call to swap1 in main Check that BLAST produces an error trace 3 Now add a second swap routine void swap2 int a int b a a bD b a bD a a bD Replace one of the calls to swap1 with swap2 Verify that BLAST still prov
27. matically infer suitable predicates is still an open area of research the problem is of course undecidable in general Of course additional predicates can be given for any program not necessarily those on which BLAST fails Our experience is that it is often useful to start with the predicates generated from the guards of the specification Therefore the instrumentation of the specification also generates a predicate file called instrumented pred which we used earlier for the previous example 3 5 Smarter Predicate Discovery The default predicate discovery engine in BLAST may not always succeed in finding good predicates Therefore BLAST implements some additional analysis for finding suitable predicates These can be accessed with the command line options craig 1 craig 1 scope and craig 2 These implement predicate discovery based on interpolants The option craig 1 scope is an efficiency heuristic on top of craig 1 it removes predicates not in scope The option craig 2 does a precise analysis On the first run craig 2 often takes more time than craig 1 but it produces a much finer abstraction Even when the default predicate discovery succeeds the craig options often succeed with fewer predicates Additional heuristics are implemented and can be accessed with the predH flag We recommend running BLAST with predH 7 level 7 is the highest level Consider for example the program foo c include lt assert h gt i
28. n different scopes then Cil renames the local variables In this case one has to look at the names produced by Cil to use the appropriate variable in the predicates 8 Aliasing Pointer aliasing is a major source of complexity in the implementation of BLAST BLAST comes with a flow insensitive and field insensitive Andersen s analysis for answering pointer aliasing questions inter nally The implementation of the pointer analysis uses BDDs Additionally BLAST allows the user to input alias information generated from some other alias analysis from a file The syntax of an alias file is a list of C equalities between C memory expressions variables dereferences field accesses separated by commas Considering possibly aliased values is essential for soundness of the analysis Consider for example the following code int main int a b int i i 0 a amp i b amp i xb 1 18 assert a 1 If the analysis proceeds without considering the alias relationship between a and b the assertion passes However updating b also updates a The analysis is expensive if the alias information is not precise since all exponentially many alias scenarios between the variables must be considered In order to improve precision BLAST makes the possibly unsound assumption that the program is type safe so that only variables of the same type may be aliased Moreover the current implementation does not handle function po
29. n xxx Specify the entry point of the program The default is main L xxx Specify an error label The default is ERROR Note that if there are several labels in the program with the same name the effect of BLAST is nondeterministic msve Parse file in MSVC mode This is required by the CIL front end The default mode is GNU CC Use this to read and analyze programs that use Microsoft Visual C features bfs and dfs Specify the search strategy breadth first or depth first The default is bfs pred xxx Specify a set of seed predicates as the initial abstraction When this is not specified BLAST starts running with the most abstract program where all the data has been abstracted The seed predicate file xxx contains a list of seed predicates each predicate is an atomic predicate using the C expression syntax See Section 7 3 for the syntax of predicates cf Use context free reachability This feature has not been tested for this release init xxx Specify the initial state in the file xxx The initial state is a side effect free C boolean expression in the program variables in scope in the start function inv xxx Specify additional invariants in a file These are conjoined with the set of reachable states The invariant file contains a C boolean expression s xxx Specify the satisfiability solver to be used by the decision procedures in BLAST The current options are Vampyre Simplify and Cvc the default being Simplify
30. nt main int i x y ctr x ctr yr x y x if ctr i assert y i 1 Let foo i be the preprocessed program as above Running pblast opt foo i does not succeed and says No new predicates found However running pblast opt foo i craig 1 predH 7 verifies that the program is safe 3 6 Saved Abstractions When BLAST finishes running on the program filename c it creates a file called filename abs containing the abstraction that was used This abstraction can be used in subsequent runs to save time in predicate discovery Subsequent runs may be required in a regression testing scenario where some parts of the program has changed and BLAST is run to verify the property on this new program The old abstraction file can be read in with the loadabs flag For example after we have run pblast opt foo i craig 1 predH 7 a file called foo abs is created Subsequently running pblast opt foo i craig 1 predH 7 loadabs will reuse the previous abstraction and do the verification much faster 4 The Specification Language 4 1 Tool usage The specification language is processed by a command line tool that takes as input a specification and a list of C source files A single instrumented C source file is created that combines the input sources and ensures that they satisfy the properties described in the specification An instrumented pred file containing hint predicates for BLAST is also generated For
31. rious operations that have been hitherto selected FF REW The third pair move to the next or previous point in the trace where the values of the predicates are different from the present values thus they skip over irrelevant operations and proceed directly to the nearest operation that changes the values of the predicates Pred Change The fourth pair are used after first selecting some predicate in the rightmost pane after selecting the predicate if one clicks the right left button one is taken to the first operation in the future past where the value of that predicate is about to has just change d This pair is used to see which operations cause a predicate to get its value at some point in the trace In the given counterexample we see that the first operation is a call to __initialize__ which isa spec function that sets the initial value of the spec variable lockStatus The very next statement sets lockStatus to 0 and on selecting that operation notice that in the rightmost pane the state is such that lockStatus 0 and lockStatus 1 is false i e its negation is true In this pane select the predicate lockStatus 0 and then click the Right Pred Change button the right arrow with the orange sun behind it The gui leaps forward to the operation where lockStatus is going to be set to 1 On pressing the Undo button the gui jumps back to the previous operation that was being viewed You can play around with the trace and
32. rp struct Device devExt FSMInit devExt amp devE driver code do FSMLock nPacketsOld nPackets request devExt gt WriteListHeadVa if request 0 amp amp request gt Status 0 devExt gt WriteListHeadVa request gt Next FSMUnLock irp request gt irp if request Status gt 0 irp Status STATUS_SUCCESS irp Information request Status else irp Status STATUS_UNSUCCESSFUL irp Information request Status SmartDevFreeBlock request IO_NO_INCREMENT 3 IoCompleteRequest irp IO_NO_INCREMENT nPackets nPackets 1 while mPackets nPackets0ld FSMUnLock For simplicity we assume that there is just one global lock that is acquired by a call to FSMLock and released by a call to FSMUnLock We wish to check that the function main calls FSMLock and FSMUnLock in alternation if there are two successive calls to FSMLock without a call to FSMUnLock in the middle it is an error similarly if there are two successive calls to FSMUnLock without a call to FSMLock in the middle it is an error One way to check this property is to instrument the program manually by adding some observer variables and instrumenting the program to update the observer variables at each interesting program event Then the check for the safety property can be reduced to checking an assertion on the observer variables For example in the above code we can
33. tatus defines an observer variable lockStatus and initializes it to 0 The specification is given in terms of program events There are three interesting events in this specification calls to the functions FSMInit FSMLock and FSMUnLock Each event is associated with a syntactic pattern in the code For example the pattern FSMLock is matched every time there is a call to FSMLock in the code Each pattern has a guard that must be met when that pat tern matches in the code for example when the pattern FSMLock is matched the variable lockStatus must be 0 If not there is a violation of the property If the guard is true it can be omitted Moreover there is an action associated with the event that specifies how the observer variables must be updated BLAST comes with an instrumentation tool that takes a specification and a program and builds an instrumented program from them To use this we say spec opt lock spc tut2 c This builds an instrumented program called instrumented c as well as a predicate file instrumented pred We can now run BLAST on this file first clear the contents of the Command pane then in the File menu load instrumented c as the source file and instrumented pred as the predicate file Notice that in the Source pane the source of this program is given and in the Predicates pane are listed the predicates created from the specification namely a predicate tracking the values of lockstatus lockstatus 0 lockstat
34. though scheck does not fail 14 incref default Incomplete counterexample analysis BLAST with full alias analysis is expensive especially when the alias analysis is imprecise Often aliasing is not important and this option gets a middle ground the counterexample analysis is done without the aliasing information but the model checking uses the alias information The analysis is sound but BLAST can fail if the analysis requires aliasing relationships to be tracked cref Complete counterexample analysis BLAST considers the alias analysis information not only for the model checking but also for the counterexample analysis This analysis is more expensive but helps extracting predicates that track aliasing relationships nofp Ignore function pointer calls This is put in as a convenience the programmer can ignore function pointer calls in the analysis Use with caution the results of BLAST are meaningful only under the assumption that the function pointer calls did not change the predicate state of the program bddcov and nobddcov The option bddcov uses only bdds in cover check nobddcov does a full cover check The default is bddcov It is unlikely you will need to change the default wpsat Keep only satisfiable disjuncts in the weakest precondition restart Restart model checking after every counterexample analysis a k a SLAM mode block Analyze trace as blocks This is the default overriding the earlier counter
35. us 1 Now press the Run button to run BLAST which reports that the specification is indeed met by the program Exercise 2 1 What predicates are used by BLAST to prove this property Let us now repeat the above with a buggy version of the tut2 c Comment out the line nPackets nPackets 1 and repeat the above i e run spec opt and then run BLAST on instrumented c This time the tool reports an error trace in the counterexample trace pane 3 3 1 The Counterexample Trace Pane The counterexample trace pane is broken into 3 subpanes the leftmost is the program source the middle pane is the sequence of operations that is the counterexample and the rightmost pane contains the state of the system given by values for the various predicates in the top half and the function call stack in the lower pane at the corresponding points in the counterexample One can see the state of the system at different points of the trace by clicking on the corresponding operation in the middle pane When one chooses an operation in the middle pane the corresponding program text is highlighted in the left pane and the predicate values and control stack are shown in the right pane Alternatively one can go back and forth along the trace using the arrows along the bottom Adjacent The first pair move to the appropriate adjacent operation Undo Redo The second pair are like web browser buttons in that they move to the previous or next operation among the va
36. variants of the program The programmer writes assert e in the code where e is a C expression If the expression e evaluates to 0 at run time the program aborts The intent is that the programmer has reasoned that e is an invariant of the program at the place the assert has been introduced Consider for example the following piece of code include lt assert h gt int foo int x int y if x gt y x x y L assert x gt 0 By the constraints introduced by the checks the programmer knows that at the label L the value of x is greater than 0 Assertions are typically checked at run time during the testing phase of a program However using BLAST one can check assertions statically during compile time Moreover there is no explicit test case to be written To run the above example through BLAST you must do the following First instead of the sys tem header file assert h you must use the assert h file provided with BLAST in the directory test headers of the distribution Then you must produce a preprocessed file containing the source code The above file is in test tutorial tut1 c Create a preprocessed file by using the commands gcc E I BLASTHOME test headers tuti c gt tut1 i This creates a preprocessed file called tut1 i Now we can run BLAST on this file Running BLAST from the Command Line The basic command to run BLAST is pblast opt filename main mainfun where filename is the file you are checking ma
37. ws with Cygwin You should independently download and install the Simplify Theorem Prover see item 5 below BLAST requires that the Simplify theorem prover is in the path 2 2 Downloading the Source Distribution You will need OCaml to build BLAST BLAST has been tested on Linux and on Windows with Cygwin If you want to use BLAST on Windows then you must get a complete installation of Cygwin and the source code OCaml distribution and compile it yourself using the Cygwin tools as opposed to getting the Win32 native code version of OCaml If you have not done this before then take a look here 1 Download the BLAST source distribution 2 Unzip and untar the source distribution This will create a directory called blast 2 4 whose structure is explained below tar xvfz blast 2 4 tar gz 3 Enter the blast 2 4 blast directory and run GNU Make to build the distribution cd blast 2 4 blast make distclean make 4 You should now find the executables pblast opt and spec opt in the directory bin These are symbolic links to files of the same name in the directory psrc and spec respectively The executable pblast opt is the BLAST model checker the executable spec opt is the specification instrumenter 5 You should also download and install the Simplify Theorem Prover This involves putting the executables Simplify Linux or Simplify exe Windows in the bin directory Additionally BLAST has interfaces to the Cvc Theorem Prover should
Download Pdf Manuals
Related Search
Related Contents
SBS TESCREENGLASSAS6 screen protector Fantom-S_S88 Quick Start Our Surveillance Catalog Power Auger Doro HearPlus eh343m Belkin Screen Guard 360° Privacy Overlay OBD Bluetooth Transmitter User`s Manual Keysight U1231A, U1232A, y U1233A Multímetro digital portátil Sony VAIO VPCY216FX Copyright © All rights reserved.
Failed to retrieve file