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

标签 c free static-analysis

我想从 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.dotgraph.f。点分别包含main()f()的PDG。

您可以使用 dot 程序漂亮地打印其中之一:dot -Tpdf graph.main.dot > graph.pdf

结果如下:

PDG of main()

注意从节点 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/

相关文章:

c - 释放其分配区域之外的内存

c - 为什么内存在我的 C 反向列表函数中泄漏?

java - 依赖关系分析工具 - 更新回归测试用例

c - 访问字符数组时状态访问溢出

c - 类型转换为不同的编译器提供不同的结果

c - 在 C 中取消引用释放的指针

java - 估计大型代码库中所需的单元测试

haskell - 应用仿函数分析

在 while 循环中每 40 秒调用一个函数

c - Fortran 在两个 C 函数之间传递 C 结构