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

Gru*_*eck 2 java assembly bytecode java-bytecode-asm

我试图使用Java字节码工程库ASM来执行静态分析.我有这种情况,我想检查分配给字段的变量.

我有MethodVisitor实现该visitFieldInsn()方法.我特意找这个putfield命令.那没问题.问题是,当我遇到时putfield,我希望能够访问将分配给该字段的变量.具体来说,我想访问有关变量类型的信息.

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

有没有办法使用ASM来检查堆栈上的变量?

Eug*_*hov 5

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

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