防止Frama-C';s从更改输入代码中切片插件

防止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

给定一个C文件,我想计算一些条件的向后切片,并将该切片与原始代码进行比较。因为我不想从cratch实现切片程序,所以我已经试着习惯Frama-C,它似乎有助于完成这项任务

然而,我的问题是,Frama-C的切片插件更改了预处理的输入代码,因此很难识别原始代码的哪些行也出现在切片中

例如:

输入文件
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