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

标签 java assembly java-bytecode-asm

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

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

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

最佳答案

如果字节码无效,最大堆栈和变量计算可能会产生错误的结果。您可以通过 CheckClassAdapter 运行生成的代码来验证这一点.

例如,

  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);

关于java - ASM(来自 ObjectWeb)即使设置了 ClassWriter(COMPUTE_MAX + COMPUTE_STACK)也无法正确计算 MaxStack,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2235493/

相关文章:

c - 何时在扩展的 GCC 内联汇编中使用 earlyclobber 约束?

java - 使用 ASM (5.x) : howto? 在字节代码中检测运行时的递归方法调用

java - 变量定义和赋值检测asm字节码

java - Android - 禁用软键盘弹出

java - 应用程序正在运行,但现在意外关闭

java - WPF客户端和Java服务器端?

c - ARMv7 汇编函数中查找数组最大元素时出现总线错误

linux - 在 nasm 程序集中的 .data 段之外声明字符串

java - 为什么 methodvistor.visitMaxs(0,0) 在 Java asm 中崩溃?

java - 从 jmap 获取永久空间