我想探索Frama-C以应用基于断言的切片(使用ACSL表示法)。 我发现有几种不同版本的Frama-C具有一些不同的功能。 我的问题是哪个版本最适合为Frama-C开发一个切片插件并操纵Frama-C创建的AST。
答案 0 :(得分:5)
Frama-C已经有一个切片插件(在所有版本中)。
此插件使用值分析插件的结果,该插件假定在ACSL断言内写入的属性(在尝试验证它们之后)。
因此,根据您所谓的“基于断言的切片”(并且请注意,Google首先出现的文章是付费墙背后),您建议的内容可能已作为Frama-C插件存在 - in(以及最近两个或三个Frama-C版本中运行良好的一个)。
无论如何要回答你的问题,最好使用的版本是最新版本,截至本文撰写时为Fluorine 20130601。
Frama-C中现有切片功能的示例:
$ cat t.c
int f(unsigned int x)
{
int y;
/*@ assert x == 0 ; */
if (x)
y = 9;
else
y = 10;
return y;
}
$ frama-c -sparecode t.c -main f
...
t.c:4:[value] Assertion got status unknown.
...
/* Generated by Frama-C */
int f(unsigned int x)
{
int y;
/*@ assert x ≡ 0; */
;
y = 10;
return (y);
}
当您谈到“基于断言的切片”时,上述内容是什么?
注意:Frama-C的选项-sparecode
是标准“保留程序的所有结果”的切片选项。它仍然会删除任何没有后果的语句,例如y=3;
中的y=3; y=4;
,并且基于Frama-C的价值分析,它会删除因价值分析而被视为无法访问或没有后果的任何内容结果
另一个例子来说明:
$ cat t.c
int f(unsigned int x)
{
int y;
int a, b;
int *p[2] = {&a, &b};
/*@ assert x == 0 ; */
a = 100;
b = 200;
if (x)
y = 9;
else
y = 10;
return y + *(p[x]);
}
$ frama-c -sparecode t.c -main f
...
t.c:6:[value] Assertion got status unknown.
...
/* Generated by Frama-C */
int f(unsigned int x)
{
int __retres;
int y;
int a;
int *p[2];
p[0] = & a;
/*@ assert x ≡ 0; */
;
a = 100;
y = 10;
__retres = y + *(p[x]);
return (__retres);
}