我想从 C 源代码生成程序依赖图 (PDG)。我找到了解释如何做的论文,但都使用了商业 CodeSurfer 工具。
是否有任何免费工具或开源项目可以完成这项工作?
最佳答案
Frama-C 是一个开源静态分析平台 a slicer for C programs基于程序依赖图的计算。
请注意,对用真正的编程语言(例如 C)编写的实际程序进行切片涉及许多科学出版物中略过的特殊情况和概念。尽管如此,我相信您不会找到比 Frama-C 的 PDG 计算更简单的方法,首先是因为它是唯一可用的开源计算(据我所知),其次是因为任何其他处理 C 程序的 PDG 计算都会有解决相同的问题并引入相同的概念。
举个例子:
int a, b, d, *p;
int f (int x) {
return a + x;
}
int main (int c, char **v) {
p = &b;
a = 1;
*p = 2;
d = 3;
c = f(b);
}
命令 frama-c -pdg -pdg-dot graph -pdg-print t.c
生成点文件 graph.main.dot
和 graph.f。点
分别包含main()
和f()
的PDG。
您可以使用 dot
程序漂亮地打印其中之一:dot -Tpdf graph.main.dot > graph.pdf
结果如下:
注意从节点 c = f(b);
到节点 *p = 2;
的边。声称对 C 程序有用的 PDG 计算必须处理别名。
另一方面,使用此 PDG 对标准“输入语句 c = f(b);
”进行切片的切片器将能够删除 d = 3;
,即使通过指针访问 *p
也不会影响函数调用。
Frama-C 的切片器使用 PDG 指示的依赖关系来仅保留对用户指定的切片标准有用的语句。例如,命令 frama-c -slice-wr c t.c -then-on 'Slicing export' -print
生成下面的简化程序,其中对 d
的赋值具有已删除:
/* Generated by Frama-C */
int a;
int b;
int *p;
int f_slice_1(int x)
{
int __retres;
__retres = a + x;
return (__retres);
}
void main(int c)
{
p = & b;
a = 1;
*p = 2;
c = f_slice_1(b);
return;
}
关于c - 我可以使用哪些免费工具来生成 C 代码的程序依赖图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9804591/