繁体   English   中英

如何使用ASM访问者检查堆栈?

[英]How to inspect the stack using an ASM visitor?

我正在尝试使用Java字节码工程库ASM执行静态分析。 在这种情况下,我想检查分配给字段的变量。

我有MethodVisitor ,它实现了visitFieldInsn()方法。 我专门在寻找putfield命令。 没问题 问题是,当我遇到putfield ,我希望能够访问将要分配给该字段的变量。 具体来说,我想访问有关变量类型的信息。

目前,我真的只需要查看堆栈顶部的内容,但是如果有更通用的检查方法,那就更好了。

有没有一种方法可以使用ASM检查堆栈上的变量?

首先,如果可以假定字节码有效,则分配给字段的值的类型应与字段类型匹配,您可以使用ClassReader API预先读取该字段类型。

但是,如果需要跟踪给定指令指针的堆栈或变量插槽上每个值的来源,则可以将Analyzer API与SourceInterpreter一起使用。 基本上,它将允许查找产生给定值的指令,并且您可以使用有关该指令的信息来推导类型(例如,如果它从与方法参数相对应的变量中读取,或者值是从方法调用中返回的,情况下,您可以从方法描述符中获取类型)。 另请参阅我的旧博客文章,其中包含使用SourceInterpreter示例

我对ASM并不熟悉,但是我做的事情听起来与Eclipse Java AST框架相似。 要了解变量,我必须自己在AST访问者的适当visitX()方法中跟踪变量声明。 一旦我知道哪些AST节点对应于变量声明,这并不是很困难。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM