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

use*_*336 10 c free static-analysis

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

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

Pas*_*uoq 17

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);
}
Run Code Online (Sandbox Code Playgroud)

该命令frama-c -pdg -pdg-dot graph -pdg-print t.c生成点文件graph.main.dotgraph.f.dot包含的PDG main()f()分别.

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

结果如下:

主要PDG()

注意从节点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;
}
Run Code Online (Sandbox Code Playgroud)