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