Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JVM字节码验证器的职责_Java_Jvm - Fatal编程技术网

Java JVM字节码验证器的职责

Java JVM字节码验证器的职责,java,jvm,Java,Jvm,有人能列出字节码验证器为保证程序正确性而必须执行的主要任务吗?JVM规范中是否定义了一组标准的、最低限度的职责?我还想知道验证是否跨越了加载和初始化等其他阶段。它执行以下操作: 没有操作数堆栈溢出或下溢 类型 众所周知,所有字节码指令的参数都是 正确的 对象字段访问是合法的--私有的, 公共的,还是受保护的 参考: 这是在中指定的 本页的大部分介绍了类型安全的各个方面。要检查程序是否是类型安全的,验证器需要找出每个程序点的操作数堆栈中驻留的操作数类型,并确保它们与相应指令所期望的类型匹配 其

有人能列出字节码验证器为保证程序正确性而必须执行的主要任务吗?JVM规范中是否定义了一组标准的、最低限度的职责?我还想知道验证是否跨越了加载和初始化等其他阶段。

它执行以下操作:

  • 没有操作数堆栈溢出或下溢
  • 类型 众所周知,所有字节码指令的参数都是 正确的
  • 对象字段访问是合法的--私有的, 公共的,还是受保护的
参考:

这是在中指定的

本页的大部分介绍了类型安全的各个方面。要检查程序是否是类型安全的,验证器需要找出每个程序点的操作数堆栈中驻留的操作数类型,并确保它们与相应指令所期望的类型匹配

其验证的其他事项包括但不限于:

  • 分支必须在方法的代码数组的范围内

  • 所有控制流指令的目标都是指令的开始。在宽指令的情况下,宽操作码被认为是指令的开始,给出由该宽指令修改的操作的操作码不被认为是指令的开始。不允许分支到指令中间

  • 任何指令都不能访问或修改索引大于或等于其方法指示其分配的局部变量数的局部变量

  • 对常量池的所有引用都必须指向相应类型的条目。(例如,指令getfield必须引用一个字段。)

  • <> >代码不在指令的中间结束。

  • 执行不能脱离代码的结尾

  • 对于每个异常处理程序,受处理程序保护的代码的起始点和结束点必须位于指令的开头,如果是结束点,则必须立即超过代码的结尾。起点必须在终点之前。异常处理程序代码必须从有效的指令开始,而不能从被wide指令修改的操作码开始


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

或者,您可以查看James Gosling的白皮书

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

该图显示了Java语言的数据流和控件流 源代码通过Java编译器,到类加载器和 字节码验证器,从而连接到Java虚拟机 包含解释器和运行时系统。重要的问题是 Java类加载器和字节码验证器没有 关于字节码流主要源的假设——代码 可能来自本地系统,或者可能已经运行了一半 环绕地球。字节码验证器充当一种守门人: 它确保传递给Java解释器的代码处于合适的状态 可以执行,并且可以运行而不用担心破坏Java 口译译员不允许以任何方式执行导入的代码 直到它通过了验证者的测试。一旦验证器 完成后,已知许多重要属性:

  • 没有操作数堆栈溢出或下溢
  • 众所周知,所有字节码指令的参数类型总是正确的
  • 对象字段访问是合法的——私有的、公共的或受保护的
虽然所有这些检查都非常详细,但到那时 字节码验证器已经完成了它的工作,Java解释器可以 继续,知道代码将安全运行。知道这些 属性使Java解释器更快,因为它不会 我得检查一下。没有操作数类型检查和堆栈 溢出检查。因此,解释器可以全速工作 在不影响可靠性的情况下


从本地文件系统加载类时是否启用Java验证器?例如,当Eclipse或Apache加载一个类时,字节码是否经过验证?