谁能列出字节码验证器必须执行的主要任务,以保证程序的正确性?在JVM规范中是否定义了标准的、最小的职责集?我还想知道验证是否跨越了其他阶段,如加载和初始化。
发布于 2012-05-12 18:27:59
这是在JVM Specification: Chapter 4.10. Verification of class Files 中指定的。
该页的大部分内容描述了类型安全的各个方面。为了检查程序是类型安全的,验证器需要找出在每个程序点的操作数堆栈中驻留着什么类型的操作数,并确保它们与相应指令所期望的类型相匹配。
它验证的其他事情包括但不限于以下内容:
修改的操作码开始
作为最后一步,验证器还执行数据流分析,确保没有指令引用任何未初始化的局部变量。
发布于 2012-05-13 01:32:50
或者,您可能想看看James Gosling的Java Language Environment白皮书。

字节码验证器遍历字节码,构造类型状态信息,并向所有字节码指令验证参数的类型。
下图显示了从Java语言源代码通过Java编译器,到类加载器和字节码验证器,再到包含解释器和运行时系统的Java虚拟机的数据流和控制流。重要的问题是,Java类加载器和字节码验证器对字节码流的主要来源没有任何假设--代码可能来自本地系统,也可能经过了半个地球。字节码验证器充当一种看门人:它确保传递给Java解释器的代码处于适合执行的状态,并且可以运行,而不必担心破坏Java解释器。导入的代码不允许以任何方式执行,直到它通过了验证器的测试。一旦验证器完成,就会知道一些重要的属性:
虽然所有这些检查看起来非常详细,但是当字节码验证器完成其工作时,Java解释器就可以继续执行了,因为它知道代码将安全运行。了解这些属性会使Java解释器更快,因为它不需要检查任何东西。没有操作数类型检查,也没有堆栈溢出检查。因此,解释器可以全速工作,而不会影响可靠性。
发布于 2012-05-12 18:27:49
它执行以下操作:
参考:http://java.sun.com/docs/white/langenv/Security.doc3.html
https://stackoverflow.com/questions/10562876
复制相似问题