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