从ANSI C代码获取控制流图

Elo*_*oar 10 c gcc graph ansi

我正在构建用于测试ansi c应用程序的工具.只需加载代码,查看控制流图,运行测试,标记所有被击中的顶点.我正在尝试通过解析代码来自己构建CFG.不幸的是,如果嵌套代码,它会搞砸.GCC提供从编译代码中获取CFG的能力.我可能会为其输出编写解析器,但我需要行号来设置断点.使用-fdump-tree-cfg或输出控制流图时是否有获取行号的方法-fdump-tree-vcg

Ioa*_*dis 18

对于C程序的控制流图,您可以查看C的现有Python解析器:

调用图是控制流图的密切相关的构造.有几种方法可用于为C代码创建调用图(函数依赖性).这可能有助于推进控制流图生成.在C中创建依赖图的方法:

遗憾的是,以下工具要求代码可编译,因为它们依赖于gcc的输出:

  • CodeViz(GPL v2)(弱点:需要可编译源,因为它使用gcc转储cdepn文件)
  • gcc + egypt + dot(GPL v*,Perl = GPL | Artistic license,EPL v1)(egypt用于gcc制作RTL,因此任何错误的源代码都会失败,或者即使您只想关注来自大型项目的单个文件因此,与cflow基于更健壮的工具链相比,它并不是非常有用.请注意,埃及默认支持从图表中排除库调用,以使其更清晰.

此外,可以使用创建C/C++的文件依赖关系图crowfood.


Elo*_*oar 7

所以我做了一些研究,并不难获得节点的行号.只需lineno在其中一个选项中添加选项即可获得它.所以使用-fdump-tree-cfg-lineno-fdump-tree-vcg-lineno.我花了一些时间来检查这些数字是否可靠.在VCG格式的图形的情况下,每个节点的标签包含两个数字.这些是由该节点表示的代码部分的开始和结束的行号.