我正在使用frama-c铝-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
邮资显示以下依存关系:
[从] ======相关内容COMPUTED ======
这些依赖关系在终止用于执行终止成立:
[从]功能主要: RES FROM A; B; ÿ
[从] ====== DEPENDENCIES ======
OF END因此它不会达到的条件C,因为已经B是假的。
我不知道是否有办法告诉frama计算所有依赖项,即使条件未满足。我尝试使用-slevel选项,但没有结果。我知道有一种方法可以使用间隔Frama_C_interval(0,1),但是当我使用它时,使用此函数的变量不会显示在依赖项中。我想得到X和Y依赖于A,B,C和水平取决于A,B,C,X,Y
任何想法?
请注意,您称之为“死分支”的语法结构对程序执行没有语义影响(例如'&& true')。因为Frama-C的依赖分析是基于语义的,所以你可能不得不“欺骗”他们考虑外部分支(例如'volatile','Frama_C_interval'等),或者尝试设计一个语法分析(例如用一个访客)可以计算你的语法依赖的概念。 – anol