c - 使用 Frama-C 进行值(value)依赖分析

标签 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-c 工具中获取此信息吗?如果是,如果有人可以帮助我,我将不胜感激。

最佳答案

您无法从您提供的 main 函数上的 Frama-C 现有插件之一获得此结果。但是,如果您稍微修改一下代码,插件 From 将准确返回您想要的信息。

// 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 test.c

[from] Done for function main
[from] ====== DEPENDENCIES COMPUTED ======
       These dependencies hold at termination for the executions that terminate:
[from] Function main:
  x FROM x; y; z; c
  y FROM y; c (and SELF)
  \result FROM \nothing
[from] ====== END OF DEPENDENCIES ======

x 的结果是不言自明的。对于 y,您会得到额外的信息,即 y 自函数开始以来可能未更改,因此 (和 SELF)

通过从 main 初始化变量得到不同结果的原因是 -deps 分析计算其结果 w.r.t.函数开始时的状态。在您的 main 中,由于 xyz 设置为常量值,因此它们的最终结果仅取决于c,这反过来仅取决于 g 读取的内容以计算其结果。

关于c - 使用 Frama-C 进行值(value)依赖分析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32016075/

相关文章:

c++ - clang : warning: principal. o: 'linker' 输入未使用

java - 下载 spring 及其依赖项

java - 解决gradle依赖关系期间的Eclipse错误

c - 如何用 Frama-C 证明 C stringCompare 函数的功能?

frama-c - 为什么求解器会在一个简单的位掩码函数上超时?

c - 写入指针时出现虚假警告

c - 使用指针和数组调试程序

c++ - sqlite3 c/c++,获取聚合查询涉及的表名

Python Ctypes 传递 .h 文件中定义的结构指针。

android - 尝试添加本地库时出现Gradle问题