即使设置了 ClassWriter( COMPUTE_MAX + COMPUTE_STACK ),ASM(来自 ObjectWeb)也无法正确计算 MaxStack

2024-02-19

当我尝试加载使用 ASM 生成的类时,我收到了预期的 ClassVerifyErrors。经过进一步检查,我可以看到 jvm 是正确的,并且正在讨论的方法具有无效的 MAX_STACK 值。奇怪的是我使用自动计算堆栈和最大本地选项,所以这应该不是问题...... 使用 invalid 选项的方法非常简单,但结果是错误的字节码。

我已经用预期的方法编写了一个类,并将我的 asm 生成的类与 javac 生成的类进行了比较,并且字节码匹配,唯一的错误是最大堆栈为 0,这是错误的,而 javac 设置了值 2。

我想避免自己计算最大堆栈/局部变量。


如果字节码无效,最大堆栈和变量计算可能会产生错误的结果。您可以通过运行生成的代码来验证这一点检查类适配器 http://asm.ow2.org/asm32/javadoc/user/org/objectweb/asm/util/CheckClassAdapter.html.

例如,

  ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
  // generate code into cw instance...

  PrintWriter pw = new PrintWriter(System.out);
  CheckClassAdapter.verify(new ClassReader(cw.toByteArray()), true, pw);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

即使设置了 ClassWriter( COMPUTE_MAX + COMPUTE_STACK ),ASM(来自 ObjectWeb)也无法正确计算 MaxStack 的相关文章

随机推荐