首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >JVM字节码验证器的职责

JVM字节码验证器的职责
EN

Stack Overflow用户
提问于 2012-05-12 18:23:55
回答 3查看 14.6K关注 0票数 21

谁能列出字节码验证器必须执行的主要任务,以保证程序的正确性?在JVM规范中是否定义了标准的、最小的职责集?我还想知道验证是否跨越了其他阶段,如加载和初始化。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-05-12 18:27:59

这是在JVM Specification: Chapter 4.10. Verification of class Files 中指定的。

该页的大部分内容描述了类型安全的各个方面。为了检查程序是类型安全的,验证器需要找出在每个程序点的操作数堆栈中驻留着什么类型的操作数,并确保它们与相应指令所期望的类型相匹配。

它验证的其他事情包括但不限于以下内容:

  • 分支必须在方法的代码数组的边界内。
  • 所有控制流指令的目标都是指令的开始。在宽指令的情况下,宽操作码被认为是指令的开始,并且给出由该宽指令修改的操作的操作码不被认为是开始指令。不允许分支到指令中间。allocates.
  • All
  • 没有指令可以访问或修改索引大于或等于其方法指示的局部变量数量的局部变量。对常量池的分支引用必须指向适当类型的条目。(例如,指令instruction.
  • Execution必须引用一个字段。)
  • 代码不在getfield中间结束不会从代码的结尾掉下来。
  • 对于每个异常处理程序,受处理程序保护的代码的起始点和结束点必须位于指令的开头,或者,如果是结束点,则必须紧接在代码结束点之后。起点必须在终点之前。异常处理程序代码必须从有效指令开始,并且不能从宽instruction.

修改的操作码开始

作为最后一步,验证器还执行数据流分析,确保没有指令引用任何未初始化的局部变量。

票数 17
EN

Stack Overflow用户

发布于 2012-05-13 01:32:50

或者,您可能想看看James Gosling的Java Language Environment白皮书。

字节码验证器遍历字节码,构造类型状态信息,并向所有字节码指令验证参数的类型。

下图显示了从Java语言源代码通过Java编译器,到类加载器和字节码验证器,再到包含解释器和运行时系统的Java虚拟机的数据流和控制流。重要的问题是,Java类加载器和字节码验证器对字节码流的主要来源没有任何假设--代码可能来自本地系统,也可能经过了半个地球。字节码验证器充当一种看门人:它确保传递给Java解释器的代码处于适合执行的状态,并且可以运行,而不必担心破坏Java解释器。导入的代码不允许以任何方式执行,直到它通过了验证器的测试。一旦验证器完成,就会知道一些重要的属性:

  • 没有操作数堆栈溢出或下溢已知所有字节码指令的参数类型始终正确
  • 对象字段访问是合法的--私有、公共或受保护的

虽然所有这些检查看起来非常详细,但是当字节码验证器完成其工作时,Java解释器就可以继续执行了,因为它知道代码将安全运行。了解这些属性会使Java解释器更快,因为它不需要检查任何东西。没有操作数类型检查,也没有堆栈溢出检查。因此,解释器可以全速工作,而不会影响可靠性。

票数 7
EN

Stack Overflow用户

发布于 2012-05-12 18:27:49

它执行以下操作:

  • 没有操作数堆栈溢出或下溢已知所有字节码指令的参数类型始终正确
  • 对象字段访问是合法的--私有、公共或受保护的

参考:http://java.sun.com/docs/white/langenv/Security.doc3.html

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10562876

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档