Frama-C代码切片器没有加载任何C文件

时间:2016-03-31 03:05:11

标签: c slice frama-c

我有一个1000行C文件,其中有10个数学算法由教授编写,我需要从1000行中删除9个数学函数及其所有依赖项,所以我正在使用Frama-C Boron windows二进制安装程序。

现在它不会加载最简单的example.c文件...我选择源文件并且没有任何加载。

Boron版本是从2010年开始的,所以我检查了如何编译后来的Frama-C:他们说我的Windows 7用户名中有空格可能会导致问题,这并不令人鼓舞。

Frama-C是我切片任务的最佳选择吗?

这是一个不会加载的示例文件:

    // File swap.c:

    /*@ requires \valid(a) && \valid(b);
      @ ensures A: *a == \old(*b) ;
      @ ensures B: *b == \old(*a) ;
      @ assigns *a,*b ;
      @*/
    void swap(int *a,int *b)
    {
      int tmp = *a ;
      *a = *b ;
      *b = tmp ;
      return ;
    }  

以下是我希望只使用一个函数的代码,该选项标记为smooth和swvd。 https://sites.google.com/site/kootsoop/Home/cohens_class_code

1 个答案:

答案 0 :(得分:3)

我查看了您链接的代码,它似乎不是Frama-C分析的最佳候选者。例如,该代码不是严格符合C99的,使用例如一些旧式原型(包括隐式int返回类型),在没有前向声明(fft)的情况下定义之前使用的函数,以及缺少的头部包含(stdlib.h)。这些都不是大问题,因为这些变化相对简单,其中一些与gcc -std=c99的工作方式类似:它们会发出警告而不是错误。但是,重要的是要注意它们确实需要非零时间,因此这不是一个“即插即用”的解决方案。

更一般地说,Frama-C依赖于CIL (C Intermediate Language)进行C代码规范化,因此切片程序可能与“原始程序减去切片语句”不同。如果目标只是删除一些语句但保持代码语法相同,那么Frama-C将不是理想的 1

最后,值得注意的是,一些Frama-C分析可以帮助查找死代码,如果代码已经拆分为函数,结果会更加清晰。例如,在正确配置的程序上使用值分析,可以查看从不执行哪些语句/函数。但这确实依赖于缺少至少某种未定义的行为。

E.g。如果您的程序中使用了未初始化的变量(C标准禁止使用,但偶尔会发生并且不被注意),则值分析将停止其传播,之后的代码可能会被标记为已死,因为它语义< / em>死了标准。重要的是要意识到这一点,因为一种天真的方法会产生误导。

总的来说,对于您提到的代码大小,我不确定Frama-C是否具有成本效益的方法,特别是如果(1)您从未使用过Frama-C并且在编译时遇到问题(Boron是一个真的老版本,不推荐)和(2)如果你已经知道你的代码库,因此相对精通手动切片的部分。

1 那就是说,我不知道任何C切片器会保留这样的语句;我的观点是,虽然直觉上人们可能会认为C切片器会直接保留大部分语法,但C语言是如此狡猾的语言,这样做非常困难,因此大多数工具都会事先做一些规范化步骤。