为什么用Java执行字节码验证?

Kas*_*ska 4 java verification byte bytecode compilation

根据我对本文迄今为止的理解,作者写的主要目的是检查是否有人更改了字节码.因为"编译器为Java编程语言生成的类文件总是通过验证".这是我们有一个字节码验证器,以防止其他人恶意更改我们的字节码的唯一原因吗?

Rus*_*dov 5

另一个原因是检查字节码确保这实际上是jvm可以运行的有效字节码,它可以防止jvm运行无效代码,这可能会导致一些不可预测的结果.通过禁用字节码验证,您可以说您信任所有加载的在字节码级别没有错误.

有用的文章.

如果你有一个包含大量依赖项的大项目,你通常不能肯定地说,如果你在这个项目中的某个地方或它的依赖项中生成了一些类,即使你现在肯定是这些地方,你也不能确定那里没有bug.生成这些类的代码可能有错误,最终可能会出现无效的字节码.

甚至javac也可能有一些错误,所以即使它可以产生无效的类作为输出.


Hol*_*ger 5

编译器为 Java 编程语言生成的类文件总是通过验证

在那种形式下,该陈述是不正确的。当然,编译器是软件,软件可能有错误。因此,不能保证编译器为 Java 编程语言生成的类文件总是正确的。

此外,一个类的正确性取决于它与之交互的其他类。这些类自编译以来不得以不兼容的方式更改,因此如果您用于编译的环境与您尝试执行代码的环境不同,这些不匹配可能会导致代码被验证器拒绝,即使如果编译器做对了一切。

这已经向您指出了一个问题,即除了故意的恶意修改之外,还可能存在无意中错误引入的代码不兼容问题。验证器还可以防止此类情况发生,我想,这种情况发生的频率远高于真正的故意攻击。