我正在构建用于测试辅助应用程序的工具。只需加载代码,查看控制流程图,运行测试,标记所有命中的顶点。我正在尝试通过解析代码自行构建CFG。不幸的是,如果代码被嵌套,它会变得困惑。 GCC提供了从编译代码中获取CFG的功能。我可能会为其输出编写解析器,但是我需要行号来设置断点。使用-fdump-tree-cfg-fdump-tree-vcg输出Control Flow Graph时,是否可以获取行号?

最佳答案

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

  • PyCParser
  • pycparser
  • pyclibrary(pyclibrary的 fork )
  • joern
  • CoFlo C/C++控制流程图生成器和分析器

  • 调用图是与控制流程图密切相关的构造。
    有几种方法可以为C代码创建调用图(函数依赖项)。
    这可能有助于控制流程图的生成。
    在C中创建依赖关系图的方法:
  • 使用cflow:
  • cflow + pycflow2dot + dot(GPL,BSD)cflow健壮,因为它可以处理无法编译的代码,例如缺少包括。如果大量使用预处理程序指令,则可能需要--cpp选项来预处理代码。
  • cflow + cflow2dot +点(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 +点+ xdot
  • cscope + vim CCTree(C调用树资源管理器)
  • cscope + ccglue
  • cscope +针对C,C++,Python和Java的CodeQuery
  • 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的功能更强大的工具链相比,它不是很有用。请注意,埃及默认情况下对从图形中排除库调用提供了很好的支持,以使其更加整洁。

    同样,可以使用 crowfood 创建C/C++的文件依赖图。

    关于c - 从ANSI C代码获取控制流程图,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16393985/

  • 10-12 16:36