Experimentation

Running example

In this example, we will write a simple program initializing all the cells of an array to a given value. We start from the procedure receiving as input the array to initialize, the size of the array and the value.

    void init ( int array[ ] , int size , int value ) 
    {
        int i = 0;
        while ( i < size ) 
        {
            array[ i ] = value;
            i = i + 1;
        }
    }
           

Recall that Booster assumes the pass-by-reference paradigm when array variables are given as parameters.

We now want to call the function init from the main:

       #define SIZE
    
           void main( void ) {
             // Declaration of arrays of unknown length is OK for Booster.
             int a[ SIZE ];
             // Uninitialized variables have an unknown value.
             int v;
             
             // call the init procedure
             init( a , SIZE , v );
           }
           

Programs are checked with respect to their assertions. Booster allows specifying standard C assertions and universally quantified assertions. For our example, we want to check that, after the execution of init, the array has been initialized in all its positions from 0 to SIZE. We can specify this property in two ways: (i) a for loop checking every single position of the array or (ii) a quantified assertion. The for-loop is the standard loop we would write in a C program:

       int x;
           for ( x = 0 ; x < SIZE ; x++ ) {
             assert( a[ x ] == v );
           }
           

<span text-align:="" justify;"="">The quantified assertion, instead, offers a more convenient way (both from the user readability perspective and from the verification point of view) to express such property:

       assert( forall (int x) :: ( 0 <= x && x < SIZE ) ==> ( a[ x ] == v ) );
           

The final program will look like this:

       #define SIZE
           
           /*
            * Procedures have to be defined before they are actually called inside other procedures.
            */
    
           void init ( int array[ ] , int size , int value ) {
             int i = 0;
             while ( i < size ) {
               array[ i ] = value;
               i = i + 1;
             }
           }
           
           void main( void ) {
             int a[ SIZE ];
             int v;
             
             init( a , SIZE , v );
    
             assert( forall (int x) :: ( 0 <= x && x < SIZE ) ==> ( a[ x ] == v ) );
           }
           

The execution of Booster on this file (and the default template configuration file) prints the following output:

       # This is booster v0.1 (Beta)
           # Linked to Z3 version 4.3.1.0
           # Random seed for Z3 set to 0
           The program is safe