我正在阅读java的设计理念,这一行让我印象深刻:“VM检查Java代码的签名是否有效,如果检测到代码的任何更改,将拒绝解释。”vm如何确保字节码没有被更改?
发布于 2016-10-05 15:23:30
Java字节码类文件格式捕获调用方和被调用方中的方法签名(即方法定义)。
因此,它可以比较这两个签名,如果检测到不匹配,那么一个被编译时与另一个不同的期望,这是无效的。
字节码格式的其他特性确保所提到的签名至少在语法上也被正确使用。例如,调用方正在传递正确数量的参数,而被调用方的实现期望的正是这些参数,而不是更多的参数。(当然,这并不能防止所有可能的bug,只是某些类型的问题。)
在其他二进制可执行格式中,字节码格式的此属性不存在(或可选)。
然而,有些语言提供了不同的机制。例如,C++使用名称残缺帮助确保调用正确签名的正确方法;这是在调用站点和方法定义中捕获方法签名的一种形式。
发布于 2016-10-05 07:47:34
它利用代码签名证书。
或者简化,本质上是将校验和添加到文件中,并提供更多关于谁生成所述校验和的信息。要防止或至少检测到操作(例如替换校验和)比这要复杂一些,但我想既然您已经知道了这个术语,那么您可以在网上或文档中查找其中的大部分内容。
https://softwareengineering.stackexchange.com/questions/332842
复制相似问题