ASM - visitMaxs的错误计算 - Java 8类型推断

时间:2016-01-07 10:46:13

标签: java-8 java-bytecode-asm

我正在使用带有Tomcat 8和JDK 8的ASM 5.0.3字节代码库。所讨论的目标应用程序是 Tomcat 8示例websocket应用程序。我收到java.lang.VerifyError: Operand stack overflow Exception

(请注意,使用JDK 7和8的Tomcat 7 websocket应用程序不会出现此问题。)

我比较了注入前的字节码和注入后的字节码,以下是观察结果:

  • 在字节码注入之后,我希望看到mv.visitMaxs(6,6)用于broadcast类的websocket/chat/ChatAnnotation方法,因为我注入了一个额外的局部变量,该变量也保存在堆栈中。
  • 相反,我看到了mv.visitMaxs(0,6)。差异显示在下面的屏幕截图中: comparison of before vs after bytecode injection

换句话说,locals是正确的,但stack不正确。

  • Tomcat 7的相同比较看起来不错。后字节码输出显示正确的mv.visitMaxs(6,6)

下一步,我比较了Tomcat 7与Tomcat 8的ChatAnnotation.java的源代码。它们的主要区别在于Java 8版本的Type Inference的使用,如下面的屏幕截图所示:

Java 7 vs 8 type inference usage

一旦我更改了Java 8示例源代码以删除类型推断(即使用显式声明的类型),问题就消失了。

问题:在ASM中,我应该如何处理Java 8类型的推断,以便获得正确的stackmap?

EDIT#1 还使用Java 1.7重新编译了有问题的类,没有任何代码更改,问题就消失了。 ASM 5.0.3是否错误地计算了特定java类的Max Stack?

0 个答案:

没有答案