我可以使用哪些免费工具生成c代码的程序依赖图

我想从C源代码生成程序依赖图(PDG)。 我找到了解释它是怎么做的论文,但都使用了商业CodeSurfer工具。

有没有可以完成这项工作的免费工具或开源项目?

Frama-C是一个开源静态分析平台, 具有基于程序依赖图计算的C程序切片器 。

请注意,切割用真实编程语言(如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 tc生成包含main()f() PDG的点文件graph.main.dotgraph.f.dot

你可以使用dot程序来打印其中一个: dot -Tpdf graph.main.dot > graph.pdf

结果如下:

主要的PDG()

注意节点c = f(b);的边缘c = f(b); 到节点*p = 2; 。 声称对C程序有用的PDG计算必须处理别名。

另一方面,使用该PDG的切片器在标准“语句c = f(b);输入上切片c = f(b); “将能够删除d = 3; ,即使通过指针访问*p也不会影响函数调用。 Frama-C的切片器使用PDG指示的依赖关系来仅保留对用户指定的切片标准有用的语句。 例如,命令frama-c -slice-wr c tc -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; } 

如果你想看到相互调用的方法的依赖关系并使用gcc那么你可能会对gcc的选项-fdump-rtl-expand感兴趣。

对于使用选项-fdump-rtl-expand gcc编译的每个源文件,将输出*.expand文件。

提供给工具埃及的那些文件产生了显示方法依赖性的图形。