我有一个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
答案 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语言是如此狡猾的语言,这样做非常困难,因此大多数工具都会事先做一些规范化步骤。