Вот мой пример:
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;
}
Что я хотел бы сделать, так это найти диапазон входной переменной n при инициализации в main, что приводит к достижению суммы функции. Правильный диапазон в этом примере - [1, 10].
В этом примере я хотел бы «сохранить» исходный ввод в глобальном значении in и повторно ввести его в функцию sum, присвоив его переменной log_global и, таким образом, обнаружение исходного ввода, в результате которого была достигнута функция. При запуске frama-c в этом примере мы получаем, что диапазон log_input равен [5, 14], а диапазон log_global равен [-10, 10]. Я понимаю, почему это происходит - значение in устанавливается в начале main и на него не влияют дальнейшие манипуляции с n.
Мне было интересно, есть ли простой способ изменить это во frama-c? Может быть, простая модификация кода frama-c?
У меня была одна не связанная с этим идея - манипулировать оператором if в main:
if (in > 0){
sum(in + 4);
}
Я использовал глобальную переменную вместо n. Это действительно приводит к правильному диапазону, но это решение плохо масштабируется для более сложных функций и более глубоких стеков вызовов.