gpt4 book ai didi

scala - 验证错误: Uninitialized object exists on backward branch/JVM Spec 4. 10.2.4

转载 作者:行者123 更新时间:2023-12-02 16:23:02 25 4
gpt4 key购买 nike

JVM Spec 4.10.2.4 version 7, last paragraph ,说

A valid instruction sequence must not have an uninitialized object on the operand stack or in a local variable at the target of a backwards branch if the special type of the uninitialized object is merged with a special type other than itself

这是一个被验证者拒绝的例子 - 我怀疑它应该被接受:

public scala.Tuple2<scala.runtime.Null$, scala.runtime.Null$> apply(boolean);
flags: ACC_PUBLIC
Code:
stack=4, locals=2, args_size=2
0: new #12 // class scala/Tuple2
3: dup
4: aconst_null
5: iload_1
6: ifne 5
9: aconst_null
10: invokespecial #16 // Method scala/Tuple2."<init>":(Ljava/lang/Object;Ljava/lang/Object;)V
13: areturn
LocalVariableTable:
Start Length Slot Name Signature
0 14 0 this LC;
0 14 1 x Z
StackMapTable: number_of_entries = 1
frame_type = 255 /* full_frame */
offset_delta = 5
locals = [ class C, int ]
stack = [ uninitialized 0, uninitialized 0, null ]

错误消息提示向后跳转ifne 5

java.lang.VerifyError: Uninitialized object exists on backward branch 5
Exception Details:
Location:
C.apply(Z)Lscala/Tuple2; @6: ifne

跳转目标处堆栈上确实存在未初始化的对象;然而,在我看来,“未初始化对象的特殊类型”与自身合并,正如规范所要求的那样。

我认为只有一个堆栈映射框架,因此它不能与其他任何内容合并。

有趣的是,JVM Spec version 8 中删除了对向后分支的限制。 。

但是,Java 8 VM 中的 Verifier 仍然拒绝该示例。

我是否误读了 JVM 规范,或者该示例真的应该无法通过验证吗?我尝试了版本 1.7.0_60-b191.8.0_05-b13

<小时/>

一般研究

该问题出现在 Scala ( bugreport ) 中。要重现,请使用 scala 2.11.1,确保您使用的是 >= 1.7 的 JVM 并运行以下命令(确保将 -target:jvm-1.7 传递给 scala):

localhost:sandbox luc$ scala -target:jvm-1.7
Welcome to Scala version 2.11.1 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_55).
Type in expressions to have them evaluated.
Type :help for more information.

scala> class C {
| def apply(x: Boolean) = new Tuple2(null, {
| while (x) { }
| null
| })
| }
defined class C

scala> new C
java.lang.VerifyError: Uninitialized object exists on backward branch 5
Exception Details:
Location:
C.apply(Z)Lscala/Tuple2; @6: ifne
Reason:
Error exists in the bytecode
Bytecode:
0000000: bb00 0959 011b 9aff ff01 b700 0db0
Stackmap Table:
full_frame(@5,{Object[#2],Integer},{Uninitialized[#0],Uninitialized[#0],Null})

... 32 elided
<小时/>

如上所述 - JDK bugreport here ,我希望在那里得到回应。

JDK 错误已在 JDK 8u25 中修复

最佳答案

JDK bug已修复于 JDK 8u25

关于scala - 验证错误: Uninitialized object exists on backward branch/JVM Spec 4. 10.2.4,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24061672/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com