【问题标题】:How to inspect the stack using an ASM visitor?如何使用 ASM 访问者检查堆栈?
【发布时间】:2009-12-05 17:08:28
【问题描述】:
我正在尝试使用 Java 字节码工程库 ASM 来执行静态分析。我有一种情况,我想检查分配给字段的变量。
我有MethodVisitor,它实现了visitFieldInsn() 方法。我正在专门寻找putfield 命令。那没问题。问题是当我遇到putfield 时,我希望能够访问将分配给该字段的变量。具体来说,我想访问有关变量的 type 的信息。
目前我真的只需要查看堆栈顶部的内容,但如果有更通用的方法来检查它,那就更好了。
有没有办法使用 ASM 来检查堆栈上的变量?
【问题讨论】:
标签:
java
assembly
bytecode
java-bytecode-asm
【解决方案1】:
首先,如果你可以假设字节码是有效的,那么分配给字段的值的类型应该与字段类型相匹配,你可以使用 ClassReader API 提前读取。
但是,如果您需要跟踪给定指令指针的堆栈或变量槽上的每个单独值的来源,您可以使用带有 SourceInterpreter 的 Analyzer API。基本上,它将允许找到产生给定值的指令,并且您可以使用有关该指令的信息来推断类型(例如,如果它从对应于方法参数的变量中读取,或者如果值是从方法调用返回的,那么在两者中情况下,您可以从方法描述符中获取类型)。另请参阅我的旧博客文章,其中包含 example of using SourceInterpreter。
【解决方案2】:
我对 ASM 不熟悉,但我做过一些听起来与 Eclipse Java AST 框架相似的事情。要了解变量,我必须自己在 AST 访问者的适当的 visitX() 方法中跟踪变量声明。一旦我知道哪些 AST 节点对应于变量声明,这并不难。