我正在构建用于测试 ANSI C 应用程序的工具。只需加载代码、查看控制流图、运行测试、标记所有被命中的顶点。我正在尝试通过解析代码自行构建 CFG。不幸的是,如果代码是嵌套的,它就会变得困惑。 GCC 提供了从编译代码中获取 CFG 的能力。我可能会为其输出编写解析器,但我需要行号来设置断点。使用-fdump-tree-cfg
或-fdump-tree-vcg
输出控制流图时,有没有办法获取行号?
最佳答案
对于 C 程序的控制流图,您可以查看现有的 C Python 解析器:
- PyCParser
- pycparser
- pyclibrary (pyclibrary 的分支)
- joern
- CoFlo C/C++控制流图生成器和分析器
调用图是与控制流图密切相关的结构。 有多种方法可用于为 C 代码创建调用图(函数依赖性)。 这可能证明有助于控制流图生成的进展。 在 C 中创建依赖关系图的方法:
使用 cflow :
cflow + pycflow2dot + dot (GPL, BSD) cflow 是健壮的,因为它可以处理无法编译的代码,例如缺少包括。如果预处理器指令被大量使用,它可能需要
--cpp
选项来预处理代码。cflow + cflow2dot + dot (GPL v2, GPL v3, Eclipse Public License (EPL) v1)(注意 cflow2dot 在工作之前需要一些路径修复)
cflow + cflow2dot.bash (GPL v2,?)
cflow + cflow2vcg (GPL v2,GPL v2)
enhanced cflow (GPL v2) 带有从图中排除符号的列表
使用 cscope :
cscope (BSD)
cscope + callgraphviz +点 +x点
cscope +vim CCTree (C 调用树浏览器)
cscope + ccglue
cscope + CodeQuery适用于 C、C++、Python 和 Java
cscope + Python html producer
cscope + calltree.sh
ncc (像 cflow)
KCachegrind (KDE 依赖查看器)
不幸的是,以下工具要求代码是可编译的,因为它们依赖于 gcc 的输出:
- CodeViz (GPL v2) (弱点:需要可编译源,因为它使用 gcc 来转储 cdepn 文件)
- gcc + egypt +dot (GPL v*, Perl = GPL | Artistic license, EPL v1) (
egypt
使用gcc
生成RTL
,因此任何失败错误的源代码,甚至在你只想专注于一个更大项目的单个文件的情况下。因此,与更强大的基于cflow
的工具链相比,它不是很有用。请注意埃及有默认情况下很好地支持从图中排除库调用,使其更清晰。
此外,可以使用 crowfood
创建 C/C++ 的文件依赖关系图。 .
关于c - 从 ANSI C 代码获取控制流图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16393985/