一尘不染

是否有用于JavaScript的静态Call-Graph和/或Control-Flow-Graph API?

node.js

是否有JavaScript的调用图和/或控制流图生成器?

通话图-http:
//en.wikipedia.org/wiki/Call_graph

控制流图-http:
//en.wikipedia.org/wiki/Control_flow_graph

编辑: 我正在专门寻找一种静态工具,让我使用一些API /代码访问图形


阅读 362

收藏
2020-07-07

共1个答案

一尘不染

为此,您需要:

  • 解析,
  • 名称解析(处理范围)
  • 类型分析(虽然可以说JavaScript是“动态类型的”,但这里有各种类型的常量,包括此处特别感兴趣的函数常量)
  • 控制流分析(在方法内建立控制流图的结构)
  • 数据流分析(以跟踪这些类型的生成/使用位置)
  • 什么代表全局点分析(跟踪在函数之间传递的函数常数作为应用点的值)。

如何做到这一点在编译器文献中有很好的记录。但是,由于要花很多时间才能解决这个问题,所以“您可以使用解析器结果来获得所需的结果”形式的答案就有点不对了。

如果您可以应用所有这些机制,那么实际的结果就是一个 保守的 答案,例如“ A可能称为B”。反正这就是你所知道的

 void A(int x,y) { if (x>y) foo.B(); }

因为某个工具有时根本无法推理复杂的逻辑,所以即使应用程序设计者知道不可能,您也可能会得到“ A可能调用B”的信息:

 void A(int x) // programmer asserts x<4
   { if (x>5) foo.B(); }

eval
使问题变得更糟,因为您需要跟踪到达eval命令的字符串值结果并对其进行解析,以获取有关逃避什么代码以及评估代码可能调用的函数的某种线索。如果有人将字符串中的“
eval”传递给eval,事情就会变得很讨厌:-{您可能还需要对程序执行上下文进行建模;我怀疑有很多包含回调的浏览器API。

如果有人为您提供了具有所有必要机械的完整配置工具,可以立即解决您的问题,那显然很棒。我怀疑您不会获得这样的报价,因为这样的工具不存在。原因是需要所有基础结构。它很难构建,几乎没有人可以仅使用一种工具来证明它的合理性。如果您发现即使是一个“优化的JavaScript编译器”,也可能不会具备所有这些机制,尤其是全局分析,并且它所做的也不可能以易于使用的形式打包为您的目的而包装。

自1969年开始编程以来,我就一直在努力解决这个问题(当时我的某些程序是编译器,我想要所有这些东西)。做到这一点的唯一方法是分摊 许多
工具中所有这些机器的成本。

我公司提供了DMS Software Reengineering
Toolkit
,这是一种通用编译器分析和转换机制的程序包,具有多种具有工业实力的计算机语言前端(包括C,C
++,COBOL和yes,JavaScript)。DMS提供API,以使自定义工具可以在其通用基础上构建。

消息顶部列出的通用机制都存在于DMS中,包括控制流程图和数据流分析,可通过干净的文档化API获得这些信息。流分析必须与特定语言的前端联系在一起。这也需要一些工作,因此我们还没有针对所有语言完成它。我们已经为C完成了这一工作[在18,000个编译单元的系统上进行了整体测试,包括计算现有的250,000个函数的调用图,包括间接函数调用!],COBOL和Java,我们正在开发C
++。

DMS与该线程中的其他答案具有相同的“
JavaScript”解析器答案,并且从这个角度来看,DMS并不比其他回答“在解析器之上构建”更好。区别应该很清楚:DMS中已经存在 机械
,因此工作不是实现机械和与解析器绑定的工作之一。它只是将其绑定到解析器。这仍然有些工作,但是要比仅从解析器开始要少得多。

2020-07-07