基于Frama-C的价值相关性分析
在下列程序结束时,变量基于Frama-C的价值相关性分析,c,dependencies,frama-c,C,Dependencies,Frama C,在下列程序结束时,变量x的值取决于变量集{x,y,z,c}。类似地,变量y的值取决于变量集{y,c} int main(){ int x = 100; int y = 50; int z = 20; int c = g(); if (c){ x += y + 1; }else{ x += z + 1; y = y + 1; } return 0; } 我可以从命令行的Frama-
x
的值取决于变量集{x,y,z,c}
。类似地,变量y
的值取决于变量集{y,c}
int main(){
int x = 100;
int y = 50;
int z = 20;
int c = g();
if (c){
x += y + 1;
}else{
x += z + 1;
y = y + 1;
}
return 0;
}
我可以从命令行的Frama-c工具中获取此信息吗?如果是的话,如果有人能帮助我,我将不胜感激 您可以尝试使用
frama-c-pdg-pdg打印
选项。它调用PDG(程序依赖关系图)插件。但是你需要解码输出,这是一个由密码
您还可以使用
-pdg dot
选项,使用dot
图形格式(从)获得更友好的表示。您无法从所提供的主功能上的Frama-C现有插件中获得此结果。但是,如果您稍微修改一下代码,来自
的插件将准确返回您想要的信息
// test.c
int x = 100;
int y = 50;
int z = 20;
extern int c; // unknown value
int main(){
if (c){
x += y + 1;
}else{
x += z + 1;
y = y + 1;
}
return 0;
}
frama-c-deps测试.c
[from]为主功能完成
[来源]=======计算的依赖项======
对于终止的执行,这些依赖关系在终止时保持不变:
[发件人]功能主要:
x来自x;YZC
y来自y;c(和自我)
\无结果
[从]=======依赖项结束======
x
的结果是自我解释的。对于y
,您可以获得附加信息,即y
可能自函数开始后保持不变,因此(和SELF)
通过在main
中初始化变量而得到不同结果的原因是-deps
分析使用函数开头的状态计算其结果。在您的main
中,由于x
、y
和z
被设置为常量值,因此它们的最终结果仅取决于c
,而c
又只取决于g
读取的内容来计算其结果。是否有可能在每个程序点获得此信息?由于Frama-c在函数末尾显示依赖项,因此必须在中间程序点计算依赖项。我能在每个程序点上获得依赖关系吗?这些信息是内部计算的,但不是存储的——因为它太大,很难输出给用户。这将很难提取。您可以在文件src/from/from\u compute.ml
中使用\u cfg查看函数compute\u。函数kf
返回的结果由外部化ret\u id kf Compute.before.(Fenv.to\u ordered ret\u id)
计算。您应该能够用函数kf
的另一条语句替换ret\u id
。