从ANSI C代码获取控制流图
我正在构建用于测试ansi c应用程序的工具。只需加载代码,查看控制流程图,运行测试,标记所有命中的顶点。我试图通过解析代码自己构建CFG。不幸的是,如果代码被嵌套,它会变得混乱。 GCC提供从编译代码获取CFG的能力。我可能会为其输出编写解析器,但我需要行号来设置断点。在输出控制流程图时,是否可以通过-fdump-tree-cfg
或-fdump-tree-vcg
获取行号?从ANSI C代码获取控制流图
所以我做了一些更多的研究,并且不难得到节点的行数。只需将lineno
选项添加到其中一个选项即可获得。所以请使用-fdump-tree-cfg-lineno
或-fdump-tree-vcg-lineno
。我花了一些时间来检查这些数字是否可靠。在的情况下,VCG格式标签的每个节点包含两个数字。这些是由该节点表示的代码部分开始和结束的行号。
对于C程序,你可以看一下现有的Python解析器C的控制流图:
- PyCParser
- pycparser
- pyclibrary(的pyclibrary叉)
- joern
- CoFlo C/C++控制流程图生成器和分析器
调用图是控制流图的密切相关的构造。 有几种方法可用于为C代码创建调用图(函数依赖关系)。 这可能会证明对控制流图生成的帮助。 方式在C创建依赖图:
-
使用cflow:
- cflow的+ pycflow2dot + dot(GPL,BSD)cflow的是稳健的,因为它可以处理代码不能编译,例如缺少包括。如果大量使用预处理器指令,则可能需要使用
--cpp
选项来预处理代码。 - 的cflow + cflow2dot +点(GPL V2,V3 GPL,Eclipse公共许可协议(EPL)V1)(注意,cflow2dot需要一些路径固定它的工作原理之前)
- 的cflow + cflow2dot.bash(GPL V2,?)
- cflow的+ cflow2vcg(GPL V2,GPL V2)
- enhanced cflow(GPL V2)与列表从图表
- cflow的+ pycflow2dot + dot(GPL,BSD)cflow的是稳健的,因为它可以处理代码不能编译,例如缺少包括。如果大量使用预处理器指令,则可能需要使用
-
排除符号使用cscope:
- cscope的(BSD)
- cscope + callgraphviz + dot + xdot
- cscope + vim CCTree(C Call -tree资源管理器)
- 的cscope + ccglue
- 的cscope + CodeQuery为C,C++,Python的&爪哇
- 的cscope + Python html producer
- 的cscope + calltree.sh
ncc(CFLOW喜欢)
- KCachegrind(KDE依赖查看器)
- Calltree
以下工具不幸的是需要将代码编译,因为它们依赖于输出GCC:
- CodeViz(GPL V2)(薄弱点:需要编译源,因为它使用gcc转储cdepn文件)
-
gcc + egypt + dot(GPL v *,Perl = GPL |艺术品许可证,EPL v1)(
egypt
使用gcc
生成RTL
,因此无法使用任何错误的源代码,或者甚至在您只想关注来自大型项目的单个文件的情况下使用。因此,它与更强大的cflow
为基础的工具链。需要注意的是埃及在默认情况下良好的支持,但不包括从图形库调用,使之清洁。
此外,对于C/C++文件的依赖关系图可以crowfood
创建。
调用图不是我所需要的。我需要代码中的可视分支。我必须在代码中向用户显示所有循环和决策点。我为VCG制作了自己的解析器,但我会检查您发布的工具。 – Eloar 2013-07-25 08:35:59
[工具获取图形函数调用图代码]可能的重复(http://stackoverflow.com/questions/517589/tools-to-get-a-pictorial-function-call-graph-of-code ) – 2016-04-12 19:48:06