我可以使用哪些免费工具为C代码生成程序依赖图[英] which free tools can I use to generate the program dependence graph for c codes

本文是小编为大家收集整理的关于我可以使用哪些免费工具为C代码生成程序依赖图的处理方法,想解了我可以使用哪些免费工具为C代码生成程序依赖图的问题怎么解决?我可以使用哪些免费工具为C代码生成程序依赖图问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我想从C源代码生成程序依赖图(PDG).我找到了解释它的论文,但所有这些都使用了商业代码外工具.

是否有任何可以完成此工作的免费工具或开源项目?

推荐答案

frama-c是一个开源静态分析平台, cponicer 基于程序依赖图的计算.

请注意,切片以真正的编程语言(例如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.dot和graph.f.dot分别包含main()和f()的PDG.

您可以使用dot程序将其中之一的一个程序进行:dot -Tpdf graph.main.dot > graph.pdf

结果如下:

 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;
}

其他推荐答案

如果您想可视化方法相互调用的依赖项,并且使用gcc然后gcc的选项-fdump-rtl-expand可能对您来说很感兴趣.

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

这些文件被馈送到工具埃及 product grual Graph(s)显示了该方法的依赖性.

本文地址:https://www.itbaoku.cn/post/359050.html