对于给定的 JavaScript 代码,是否可以访问 v8 引擎的 AST?我正在使用 V8 引擎开发 JavaScript 静态分析器。
这已经很老了,但也许答案可以帮助那些偶然发现这一点的人。答案是肯定的,假设您愿意修改 V8 并编译您自己的版本。
如果是这样,那么在 compiler.cc 中,您会找到一个在整个 MakeFunctionInfo 中调用 MakeCode 的位置,它将存储在传入的 CompilationInfo 对象中的 AST 转换为本机代码。 您需要编写一个继承自 AstVisitor 的类,然后您可以通过在调用 MakeCode 之前插入以下行来检查 AST:
MyAstVisitor mAV;
// this will call VisitFunctionLiteral in your AST visitor
info->function()->Accept(mAV);
由于 V8 在实际调用函数时即时编译函数,因此在 CompileLazy 中还有另一个地方,您必须执行相同的操作才能在调用脚本的整个执行过程中获取其 AST。
由于延迟编译的原因,这可能无法让您进行静态分析,因为在您访问延迟编译内容的 AST 之前,执行已经在进行中。但这就是获取 AST 的方法。
通过
--print-ast
使用
SetFlagsFromString
好吧,我不知道你想要实现什么,但听起来你想从 C++ 代码内部修改 AST(或者也可以为它们的 JavaScript 上下文编写包装类?)。
我建议看一下头文件,它很好地解释了 V8 的 AST 上要使用的内容:
https://chromium.googlesource.com/v8/v8/+/main/src/ast/ast.h
~干杯