Я использую версию frama-c Aluminium-20160502, и я хочу узнать зависимости в большой программе. При использовании опции -deps в командной строке я обнаружил, что некоторые зависимости отсутствуют. В частности, когда несколько условий объединяются в один, если анализ зависимости останавливается всякий раз, когда одно условие ложно. В этом примере здесь:Сделайте зависимости от изображения Frama-c даже от «мертвых ветвей»
#include<stdio.h>
#include<stdbool.h>
/*Global variable definitions*/
bool A = true;
bool B = false;
bool C = true;
bool X;
bool Y;
bool res;
void main(){
if (A && B && C) {
res = X;
}else res = Y;
}
когда я пытаюсь: frama-c -deps program.c
Frama показывает следующие зависимости:
[от] ====== ЗАВИСИМОСТИ COMPUTED ======
Эти зависимости сохраняются при завершении для выполнения, которые завершаются:
[from] Функция main: res FROM A; B; Y
[от] ====== END зависимостей ======
поэтому не достигает условие С, потому что уже B ложно.
Интересно, есть ли способ сообщить Frama для вычисления всех зависимостей, даже если условие не выполняется. Я пробовал с опцией -slevel, но без каких-либо результатов. Я знаю, что есть способ использовать интервал Frama_C_interval (0,1), но когда я его использую, переменная, использующая эту функцию, не отображается в зависимостях. Я хотел бы получить X и Y, зависящие от A, B, C и res, зависящие от A, B, C, X, Y
Любые идеи?
Обратите внимание, что то, что вы называете «мертвой ветвью», представляет собой синтаксическую структуру, которая не имеет семантического влияния на выполнение программы (например, «&& true»). Поскольку анализ зависимости Frama-C основан на семантике, вам, вероятно, придется либо «обмануть» их в рассмотрение посторонней ветви (например, «volatile», «Frama_C_interval» и т. Д.), Либо попытаться разработать синтаксический анализ (например, с помощью посетитель), который вычислил бы ваше понятие синтаксической зависимости. – anol