Dud*_*lul 22 javascript call-graph control-flow serverside-javascript node.js
是否有适用于JavaScript的Call-Graph和/或Control-Flow-Graph生成器?
调用图 - http://en.wikipedia.org/wiki/Call_graph
控制流图 - http://en.wikipedia.org/wiki/Control_flow_graph
编辑:我正在寻找一个静态工具,让我使用一些API /代码访问图形
Ira*_*ter 11
为此,您需要:
如何做到这一点在编译器文献中有很好的记载.然而,实施这个相当大的汗水的问题,所以"你可以使用解析器结果得到你想要的"形式的答案,而不是错过了重点.
如果您可以应用所有这些机器,那么您将获得的实际结果是保守的答案,例如"A可能会调用B".无论如何,这是你所知道的,考虑一下
void A(int x,y) { if (x>y) foo.B(); }
Run Code Online (Sandbox Code Playgroud)
因为某个工具有时根本无法推理出复杂的逻辑,所以即使应用程序设计者知道它不可能,你也可能得到"A可能会调用B":
void A(int x) // programmer asserts x<4
{ if (x>5) foo.B(); }
Run Code Online (Sandbox Code Playgroud)
eval使问题变得更糟,因为你需要跟踪到达eval命令的字符串值结果并解析它们以获得关于什么代码被唤醒以及eval'd代码可能调用哪些函数的某种线索.如果某人将字符串中的"eval"传递给eval,事情变得非常糟糕: - {您还可能需要对程序执行上下文进行建模; 我怀疑有很多浏览器API包含回调.
如果有人为您提供的工具已经完全配置了所有必要的机器来解决您的问题,那显然会很棒.我怀疑你不会得到这样的提议,因为这样的工具不存在.原因是所有基础设施都需要; 它很难建立,几乎没有人可以为一个工具证明它的合理性.即使是"优化JavaScript编译器",如果你能找到一个可能不会拥有所有这些机制,特别是全局分析,它所拥有的东西不太可能被打包成为你的目的而设计的易于消费的形式.
自从我在1969年开始编程以来,我一直在努力解决这个问题(当时我的一些程序是编译器,我想要所有这些东西).获得这个的唯一方法是通过大量工具摊销所有这些机器的成本.
我公司提供DMS软件再造工具包,这是一套通用编译器分析和转换机制,具有各种工业级计算机语言前端(包括C,C++,COBOL和是,JavaScript).DMS提供API以支持在其通用基础上构建自定义工具.
消息顶部列出的通用机器都存在于DMS中,包括通过干净的文档化API提供的控制流图和数据流分析.流分析必须与特定的语言前端联系起来.这也需要一些工作,所以我们还没有为所有语言做过.我们这样做了C [上18000个编译单元系统作为一个整体,包括计算为目前25万层的功能,包括间接函数调用的调用图测试!],COBOL和Java,我们正在对C++的工作.
DMS与此线程中的其他答案具有相同的"JavaScript"解析器答案,从这个角度来看,DMS并不比其他答案更好,这些答案说"在解析器之上构建它".区别应该是明确的:机器已经存在于DMS中,因此工作不是实现机器并且与解析器联系; 它只是将它绑定到解析器.这仍然是一项工作,但比你刚开始使用解析器要少得多.
小智 5
一般来说,这是不可能做到的。原因是函数是一流的并且是动态类型的,例如:
var xs = some_function();
var each = another_function();
xs.map(each);
Run Code Online (Sandbox Code Playgroud)
有两个未知数。一个是被调用的'map'的版本(因为Javascript多态在一般情况下不能静态解析),另一个是分配给'each'的值,也不能静态解析。这段代码唯一的静态属性是在我们从“another_function”获得的某个函数上调用了一些“map”方法。
但是,如果这些信息足够了,那么有两种资源可能会有所帮助。一个是通用的 Javascript 解析器,特别是使用解析器组合器构建的(Chris Double 的 jsparse 是一个很好的)。这将允许您在构建解析树时对其进行注释,并且您可以向调用节点添加自定义规则以记录图形边缘。
您可能会发现另一个有用的工具(无耻插件)是我编写的名为 Caterwaul 的 Javascript 到 Javascript 编译器。它让您可以对语法树进行模式匹配,并知道如何遍历它们,这在您的情况下可能很有用。如果您想从短期执行中构建动态跟踪,它也可能有所帮助(如果您想要准确和详细的结果,这可能是您的最佳选择)。
WALA是一个开源程序分析框架,可以为JavaScript构建静态调用图和控制流图:
http://wala.sourceforge.net/wiki/index.php/Main_Page
需要注意的是,在存在和其他难以分析的构造的情况下eval,调用图可能缺少一些边缘with.此外,我们仍在致力于可扩展性; WALA还无法在合理的时间内分析jquery,但可以分析其他一些框架.此外,我们用于构建JavaScript调用图的文档目前还不是很好(改进它在我的TODO列表中).
我们正在积极研究此代码,因此如果您尝试并遇到问题,可以通过电子邮件发送WALA邮件列表(https://lists.sourceforge.net/lists/listinfo/wala-wala)或与我联系.