验证错误:向后分支上存在未初始化的对象/JVM 规范 4.10.2.4

2024-03-09

The JVM 规范 4.10.2.4 版本 7,最后一段 http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.10.2.4, says

如果未初始化对象的特殊类型与除自身以外的特殊类型合并,则有效的指令序列不得在操作数堆栈上或向后分支的目标处的局部变量中包含未初始化的对象

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

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 规范版本 8 http://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.10.2.4.

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

我是否误读了 JVM 规范,或者该示例确实未通过验证?我尝试过版本1.7.0_60-b19 and 1.8.0_05-b13.


一般研究

该问题出现在 Scala 中(错误报告 https://issues.scala-lang.org/browse/SI-8645)。要重现,请使用 scala 2.11.1,确保您使用的是 JVM >= 1.7 并运行以下命令(确保通过-target:jvm-1.7到斯卡拉):

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 错误报告在这里 https://bugs.openjdk.java.net/browse/JDK-8046233,我希望在那里得到回应。

JDK 错误已修复JDK 8u25 http://www.oracle.com/technetwork/java/javase/2col/8u25-bugfixes-2298227.html


The JDK bug https://bugs.openjdk.java.net/browse/JDK-8046233被固定在JDK 8u25 http://www.oracle.com/technetwork/java/javase/2col/8u25-bugfixes-2298227.html

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

验证错误:向后分支上存在未初始化的对象/JVM 规范 4.10.2.4 的相关文章

随机推荐

  • 纱线安装命令时出现 ESOCKETTIMEDOUT 错误

    我在使用纱线时遇到了麻烦 但仅限于一台计算机 当我跑步时yarn install有些软件包无法下载 并且出现此错误 ESOCKETTIMEDOUT 起初我只是认为存储库存在一些问题 但是 我可以通过网络浏览器下载该包 我在另一台电脑上没有任
  • 如何将 STDOUT 重定向到 NSTextView?

    有人可以告诉我如何将标准输出重定向到 NSTextView 吗 NSLog打印的信息是否属于std Thanks 下面的代码使用dup2将 stdout 插入到写入端NSPipe目的 读取端通过 GCD 调度源进行观察 该源从管道读取数据并
  • sql连接.open()异常

    我是 net 的新手 我正在开发 Windows 窗体应用程序 我正在尝试将我的应用程序连接到基于 Visual Studio 服务的数据库 我只是在提交按钮后面编写代码 private void button1 Click object
  • 如何将小部件(例如 QPushButton)动态添加到设计器内置的布局中

    我正在玩Qt 主要是想为symbian重写一个旧的java应用程序 但我自己有点困惑 我首先要说明的是 C 不是我的功夫 这可能就是问题的根源 我想做的是将一个简单的 QPushButton 添加到主窗口中的垂直布局 该窗口已在运行时在 q
  • Ruby:“意外的keyword_end”...但所有的开头和结尾都匹配

    我正在编写一段代码 它将向用户返回第 n 个素数 我在第 19 行和第 22 行收到 unexpected keywords end 语法错误 我在代码中添加了注释 以便您可以轻松找到错误的位置 def nthPrime n number
  • 如何将所有子域请求重定向到 htaccess 中的主域?

    我需要重定向所有子域请求以重定向到我的 htaccess 中的主域 我需要它还包括某种通配符重定向 例如Washington mysite com 重定向至 mysite com washington 但我还需要将子域上的任何旧网址重定向到
  • Play Framework 2.5 模块的依赖项注入

    我有一个具有以下签名的模块类 class SilhouetteModule extends AbstractModule with ScalaModule 我想注入配置 class SilhouetteModule Inject confi
  • 空白导致 div 在纯 CSS 中堆叠[重复]

    这个问题在这里已经有答案了 我正在使用纯 CSS 来布局网站 但遇到了问题 如果嵌套网格元素之间存在任何空格 则会破坏布局并将最后一个 div 推到下一行 我创建了一个测试网站 内容尽可能少 以测试是否只有我一个人这样做 但我仍然遇到了问题
  • 类签名中的“()V”是什么意思?

    我用 Javassist 创建了一个构造函数 它没有真正的方法 CtConstructor c CtNewConstructor make argTypes null newClass 当我试图发出这个班级的签名时 c getSignatu
  • 了解包含多个Content-Type标头的curl POST请求命令

    以下卷曲命令 curl v F json method update video params video id 582984001 itemState INACTIVE token jCoXH5OAMYQtXm1sg62KAF3ysG90
  • 检测登录页面中的表单身份验证超时

    当您将表单身份验证设置为在访问受保护页面时重定向到 login aspx 时 有什么好方法可以在 login aspx 中检测用户是否因为尚未登录而被发送到那里 或者因为他们的表单身份验证票证已存在已到期 我想显示 您已超时 消息 在这个问
  • 表单未提交到数据库[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 因此 当我在表单上输入信息后 它会使用新表单刷新 new php 页面 但不会提交任何信息 我没有收到任何错误 就像我在页面上单击
  • Python 中频谱图的 FFT

    我将如何使用 Python 从 WAV PCM 文件读取频率峰值 然后能够生成它的图像以进行频谱图分析 我正在尝试制作一个程序 允许您读取任何音频文件 将其转换为 WAV PCM 然后找到峰值和截止频率 Python 波库 http doc
  • Eclipse 注释/取消注释快捷方式?

    我认为这很容易实现 但到目前为止我还没有找到评论 取消评论快捷方式的解决方案Java class editor and jsf faceted webapp XHTML file editor to quickly comment unco
  • Node.JS 中的 createReadStream

    所以我使用了 fs readFile 它给了我 致命错误 CALL AND RETRY LAST 分配失败 进程超出 记忆 由于 fs readFile 在调用回调之前将整个文件加载到内存中 我应该使用 fs createReadStrea
  • CSS 过渡在悬停时闪烁

    太棒了 你用宝贵的时间阅读我的问题 我正在尝试在悬停时翻转 div 一切都很顺利 但在转换过程中它会闪烁 看起来几乎像是翻转了多次 这破坏了翻转的整体效果 下面是我的代码和小提琴 小提琴 FIDDLE http jsfiddle net h
  • WinRT 应用程序中的 app.config 相当于什么?

    在 Windows 桌面开发 WinForms WPF 中 app config是放置应用程序中使用的连接字符串或 uri 等内容的潜在位置 这允许最终用户在应用程序范围内更改这些设置 而无需开发人员重新构建和重新部署 WinRT应用程序中
  • Intellij / Android Studio 可以折叠注释吗?

    我在intellij中注释掉了这段代码 如您所见 此处无法折叠评论 然而 Webstorm 中相同的注释块可能会被折叠 有没有办法在intellij Android Studio中配置注释折叠 折叠任意选定的块 在编辑器中选择连续的代码片段
  • Django CSRF 框架有很多失败

    我的站点上的 CSRF Django 中间件 来自 SVN trunk 的版本 出现了很多失败 我得到的唯一错误是 CSRF 失败 原因 CSRF 令牌丢失或不正确 我如何诊断这些 CSRF 错误来自何处 我自己无法导致 CSRF 错误 但
  • 验证错误:向后分支上存在未初始化的对象/JVM 规范 4.10.2.4

    The JVM 规范 4 10 2 4 版本 7 最后一段 http docs oracle com javase specs jvms se7 html jvms 4 html jvms 4 10 2 4 says 如果未初始化对象的特殊