我试图用Java字节码工程库 ASM 进行静态分析。我在我想检查变量的情况被分配给一个字段。

我有MethodVisitor它实现了visitFieldInsn()方法。我专门找putfield命令。这是没有问题的。问题是,当我遇到putfield,我希望能够访问,那将被分配到外地的变量。具体来说,我想访问有关的类型信息可变的。

目前,我真的只需要看看在堆栈的顶部是什么,但如果有检查它更通用方式,那就更好了。

是否有使用ASM检查堆栈上的变量的方法吗?

有帮助吗?

解决方案

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

然而,如果您需要跟踪其中堆栈上的每个单独的值或对于给定的指令指针可变时隙从来到,则可以使用与SourceInterpreter分析仪API。基本上,它会允许找到产生给定的值的指令并且可以使用关于该指示信息来推断一个类型(例如,如果它从对应于方法参数,或者如果从一个方法调用被返回值的变量进行读取,因此在这两个情况下,你可以从方法描述符类型)。还看到我有使用SourceInterpreter 的例如旧的博客文章。

其他提示

我不熟悉ASM,但我已经做了一些听起来与Eclipse的Java AST框架相似。要了解变量,我必须保持跟踪变量声明自己在适当的visitX()的AST游客的方法。这不是非常困难的,一旦我知道哪些AST节点对应于变量声明。

scroll top