Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Calculate reachability to a function using frama-c's value analysis

Here is my example:

int in;
int sum(int n){
    int log_input = n;
    int log_global = in;
    return 0;
}

int main(){
    int n = Frama_C_interval(-10, 10);
    in = n;
    if (n > 0){
        sum(n + 4);
    }
    return 0;
}

What I'd like to do is to find the range of the input variable n when initialized in main that results in reaching the function sum. The correct range in this example is [1, 10].

In the sample, I'd like to "save" the original input in a global value in and reintroduce it in the function sum by assigning it into the variable log_global and thus discovering the original input that resulted in reaching the function. When running frama-c on this sample, we get that the range of log_input is [5, 14] and the range of log_global is [-10, 10]. I understand why this happens - the value of in is set at the start of main and is not affected by further manipulations on n.

I was wondering whether there is a simple way to change this in frama-c? Perhaps a simple modification in frama-c's code?

One unrelated idea I had was to manipulate the if statement in main:

if (in > 0){
    sum(in + 4);
}

I used the global variable instead of n. This indeed results in the right range but this solution doesn't scale well to more complicated function and deeper call stacks.

like image 665
Maor Veitsman Avatar asked Feb 03 '16 11:02

Maor Veitsman


1 Answers

Here is a possible solution. Use the builtin Frama_C_interval_split and an appropriate -slevel N (here, at least N=21). The function sum will be examined N times, one for each possible value of N, and the result will be precise

int n = Frama_C_interval_split(-10, 10);

The results:

 [value] Values at end of function sum:
  log_input ∈ [5..14]
  log_global ∈ [1..10]
  __retres ∈ {0}

(Basically, this amounts to performing manual model-checking, so the performances won't be good for large values of N.)

like image 106
byako Avatar answered Sep 20 '22 03:09

byako