2

     我希望能够使用一种工具,让您在源代码的上下文中可视化程序的控制流。澄清一下,这样的工具基本上应该通过以多向图的形式吐出人类可读的抽象语法树来显示程序中发生的事情,其中​​节点包含源代码翻译单元的片段。我认为,生成的图形初始节点将包含以程序入口点开头的代码块(main用于 C 或 C++ 程序。)当节点需要引用另一个代码块时,将创建新节点,无论是在当前文件中还是在另一个文件中,箭头都会连接节点。这样的工具是否存在,还是必须从头开始创建?

4

1 回答 1

1

你不会得到一个现成的用于任意语言的工具。有太多的语言,每一种都有自己的语法和语义。您以某种方式需要每种语言的工具。您可能会发现此类工具适用于非常常用的语言,例如,软件的理解

我认为做到这一点的唯一方法是构建元工具,以便相对容易地构建特定于语言的工具。这样的工具必须具有所有此类语言处理工具所需的通用机制:强大的解析器(因此为语言编写语法相对简单)、AST 构造机制、符号表支持、构建控制和数据流图的例程。通过提供这样的机器,人们可以以适度的成本构建语言前端。

有一类工具可以做到这一点,程序转换。他们中的大多数都有解析引擎,但没有我上面建议的其他机制。

我相信这足以让我花费 20 年的时间来构建这样的元工具。我们的DMS Software Reengineering 工具包显示了它在解析大约50 多种语言方面的实力,包括令人震惊的 C++14(MS 和 GNU 变体)。它显示了对 COBOL、Java、C、C++ 的符号表支持和控制流图构建。(我们不能一次做所有事情;尽可能快地踩踏板)。[DMS 将这些图表构建为数据结构,而不是“显示”它们;该页面上的示例是在 DOT 的额外帮助下绘制的]。

尝试执行此操作的少数其他工具之一是Clang/LLVM;这涵盖了多种流行语言。据我所知,Clang 没有任何特定的解析支持。您可以自己编写代码。我认为只有在将语言转换为 LLVM 后才能获得控制流图。我也不认为它对绘制控制流图有任何特定的支持。

CoCo/R是一个在该领域以多语言支持而享有盛誉的旧工具;我对此了解不多。我知道它可以解析,并且对 AST 有一些支持;我不知道它对控制流分析有什么作用。

于 2015-11-11T03:00:25.797 回答