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

时间:2018-05-23 09:50:15

标签: java compilation byte bytecode verification

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

3 个答案:

答案 0 :(得分:5)

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

有用的article

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

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

答案 1 :(得分:4)

  

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

在这种形式中,陈述不正确。当然,编译器是软件,软件可能有bug。因此,无法保证编译器为Java编程语言生成的类文件始终是正确的。

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

这已经指出了一个问题,除了故意的恶意修改之外,还可能存在错误引入的代码不兼容性而没有恶意。验证者还可以防止出现这种情况,我认为这种情况发生的频率远远超过真正的故意攻击。

答案 2 :(得分:2)

因为您通常不是您在程序中使用的唯一类提供者。您可以使用第三方库以及第三方类代,例如一些自定义Java编译器而不是官方编译器。或者官方Java编译器可能只有一个没人注意到的错误。

如果由于它使用的某个类,最终访问从未正确定义的变量,那么这违反了Java语言和Java平台保证,并且Java不能再保证任何其他部分该计划将按照承诺行事。

因此,验证者会检查您是否处于这种情况,如果是,请通知您,而不是让您的程序完全出乎意料地行事,是的,可能是危险的,而不是让您陷入困境。