基于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