防止Frama-C';s从更改输入代码中切片插件
给定一个C文件,我想计算一些条件的向后切片,并将该切片与原始代码进行比较。因为我不想从cratch实现切片程序,所以我已经试着习惯Frama-C,它似乎有助于完成这项任务 然而,我的问题是,Frama-C的切片插件更改了预处理的输入代码,因此很难识别原始代码的哪些行也出现在切片中 例如: 输入文件防止Frama-C';s从更改输入代码中切片插件,c,frama-c,program-slicing,C,Frama C,Program Slicing,给定一个C文件,我想计算一些条件的向后切片,并将该切片与原始代码进行比较。因为我不想从cratch实现切片程序,所以我已经试着习惯Frama-C,它似乎有助于完成这项任务 然而,我的问题是,Frama-C的切片插件更改了预处理的输入代码,因此很难识别原始代码的哪些行也出现在切片中 例如: 输入文件test1.c: double func1(double param) { return 2+param; } int main() { int a=3; double c=4
test1.c
:
double func1(double param) {
return 2+param;
}
int main() {
int a=3;
double c=4.0;
double d=10.0;
if(a<c)
c=(double)a/4.0;
double res = func1(c);
return 0;
}
/* Generated by Frama-C */
double func1(double param)
{
double __retres;
__retres = (double)2 + param;
return __retres;
}
int main(void)
{
int __retres;
int a;
double c;
double d;
double res;
a = 3;
c = 4.0;
d = 10.0;
if ((double)a < c) c = (double)a / 4.0;
res = func1(c);
__retres = 0;
return __retres;
}
切片(由frama-c生成-切片调用func1 test1.c-然后在“切片导出”-打印):
请注意,main
的签名不同,func1
的名称更改为func1\u slice\u 1
有没有办法抑制这种行为,以使切片和(预处理的)原稿更容易比较(根据可计算的差异)?首先,澄清一个简单的问题,你不需要回答,但搜索相同关键字的人可以,不能将切片程序打印为原始程序行的选择(基本上,这两个程序之间的大部分差异都对应于丢失的信息。如果信息存在,则将用于打印最相似的程序)。 您可以做的是打印Frama-C对原始程序的表示,您已经在使用
Frama-C test2.C-print-ocode test2\u norm.C
执行该操作
要解决将func1
重命名为func1\u slice\u 1
的问题,您可以尝试使用选项-切片级别0
:
$ frama-c -slicing-level 0 -slice-calls func1 test1.c -then-on 'Slicing export' -print
...
/* Generated by Frama-C */
double func1(double param)
{
double __retres;
__retres = (double)2 + param;
return __retres;
}
void main(void)
{
int a;
double c;
double res;
a = 3;
c = 4.0;
c = (double)a / 4.0;
res = func1(c);
return;
}
我认为这将阻止切片器在func1
内部进行切片。帮助说:
-slicing-level <n> set the default level of slicing used to propagate to the
calls
0 : don't slice the called functions
1 : don't slice the called functions but propagate the
marks anyway
2 : try to use existing slices, create at most one
3 : most precise slices
-切片级别设置用于传播到对象的默认切片级别
电话
0:不要对调用的函数进行切片
1:不分割调用的函数,而是传播
反正是马克
2:尝试使用现有切片,最多创建一个
3:最精确的切片
好的,差不多可以了。但是你,;是的,它将阻止切片器对func1进行切片,这实际上不是我想要的:-/I gues没有明显的方法可以阻止它重命名函数,因此我可能不得不篡改Frama-C的源代码code@Paddre对除3之外的所有选项最多应创建一个新版本的
func1
,因此您可以希望将其命名为func1
。然而,问题在于细节。在一个名为slicingMacros.ml
的文件中试试运气,或者您可以使用一个regexp(可能更改slicingMacros.ml
只是为了使它更易于使用regexp替换)来将所有出现的X_slice_1; 1更改为X?实际上,我必须编辑的不是slicingMacros.ml
,但是slicingTransform.ml
(在slicingMacros.ml
中编辑适当的行似乎没有任何效果)。我将编辑您的答案,以便将其标记为“已接受”。哦,对了,我搜索了“\u slice
,只找到了前者,但现在您提到了它,我发现slicingTransform.ml
包含类似Printf.sprintf”%s\u slice\u%d“fname ff\u num
的表达式,这也将是一个很好的调整位置。很高兴您(显然)设法使它工作起来。
-slicing-level <n> set the default level of slicing used to propagate to the
calls
0 : don't slice the called functions
1 : don't slice the called functions but propagate the
marks anyway
2 : try to use existing slices, create at most one
3 : most precise slices