我想从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 -dot-pdg graph -pdg-print t.c分别生成包含main()和f()的PDG的点文件graph.main.dot和graph.f.dot.
您可以使用点程序来漂亮地打印其中之一:dot -Tpdf graph.main.dot> graph.pdf
结果如下:
注意节点c = f(b)的边缘;到节点* p = 2;声称对C程序有用的PDG计算必须处理别名.
另一方面,使用该PDG切片器的条件“语句c = f(b)”的输入将能够去除d = 3;即使通过指针访问也不能影响函数调用*页.
Frama-C的切片器使用PDG指示的依赖关系来保留对用户指定的切片标准有用的语句.例如,命令frama-c -slice-wrc 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; }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。