加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 03:23:05 所属栏目:百科 来源:网络整理
导读:我想从C源代码生成程序依赖图(PDG).我找到了解释如何做的文章,但都使用了商业的CodeSurfer工具. 有没有任何可以做这项工作的免费工具或开源项目? 解决方法 Frama-C是一个开源静态分析平台,具有基于程序依赖图计算的 a slicer for C programs. 请注意,用C编
我想从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;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读