Thales Silva
Thales Silva

Reputation: 43

Frama-C - Get function input value through command line

Analysing the code below on GUI, it is possible check the input values of the function div0.

int div0(int x, int y)                                                                                                                                                                                                                                                                                                 
{                                                                                                                                                                                                                                                                                                                      
  return (x/y);                                                                                                                                                                                                                                                                                                        
}                                                                                                                                                                                                                                                                                                                      
                                                                                                                                                                                                                                                                                                                       
int main()                                                                                                                                                                                                                                                                                                             
{                                                                                                                                                                                                                                                                                                                      
  int res;                                                                                                                                                                                                                                                                                                             
  int a = 4;                                                                                                                                                                                                                                                                                                           
  int b = 2;                                                                                                                                                                                                                                                                                                           
                                                                                                                                                                                                                                                                                                                       
  res = div0(a,b);                                                                                                                                                                                                                                                                                                     
                                                                                                                                                                                                                                                                                                                       
  return 0;                                                                                                                                                                                                                                                                                                            
}

Value Tab showing input values

Is it possible get this value through command line?

Upvotes: 4

Views: 120

Answers (1)

anol
anol

Reputation: 8953

The simplest approach in your case is to insert calls to Frama_C_show_each, which is a special Frama-C builtin function that prints the internal Eva state for the given expressions, each time the interpreter passes through the program point. For instance:

int div0(int x, int y)
{
  Frama_C_show_each_div0(x, y);
  return (x/y);
}

Running frama-c -eva on the modified program will print:

[eva] file.c:3: Frama_C_show_each_div0: {4}, {2}

You can choose the suffix after Frama_C_show_each for each line you want. For instance, if you prefer to print each variable separately:

int div0(int x, int y)
{
  Frama_C_show_each_x(x);
  Frama_C_show_each_y(y);
  return (x/y);
}

Will print instead:

[eva] file.c:3: Frama_C_show_each_x: {4}
[eva] file.c:4: Frama_C_show_each_y: {2}

For a more complex situation, or to avoid modifying the source code, other alternatives are possible, but they may require writing some OCaml code, either to modify Eva directly, or to add e.g. a new abstract domain which will print the expressions. But it's overkill for simple cases.

By the way, if you want your code to still compile normally, simply protect the call to Frama_C_show_each with #ifdef __FRAMAC__ guards:

int div0(int x, int y)
{
#ifdef __FRAMAC__
  Frama_C_show_each_div0(x, y);
#endif
  return (x/y);
}

Upvotes: 4

Related Questions