问题 为什么JSR / RET不推荐使用Java字节码?


有谁知道为什么在Java 6中不推荐使用JSR / RET字节码对?

我在网上发现的唯一有意义的解释是,他们通过运行时进行代码分析更难以执行。有谁知道另一个原因?


11687
2018-05-03 14:37


起源

你是说JVM弃用了,还是Oracle的Java编译器不再使用它?我在JVMS 7上找不到弃用通知 docs.oracle.com/javase/specs/jvms/se7/html/... - Ciro Santilli 新疆改造中心 六四事件 法轮功
@CiroSantilli巴拿马文件六四事件法轮功:经过大量的搜索,我在Java 7类(类文件格式51.0)中找到了针对这些指令的规则。在里面 §4.9.1 JVMS。看到 我的问答 详情。 - MvG


答案:


由于一些正常的字节码约束(例如在进入JSR时具有一致的堆栈形状),JSR和RET使得字节码验证比原本要困难得多。好处很小(在某些情况下可能会稍微小一点的方法),并且验证程序在处理奇怪的JSR / RET模式(以及潜在的安全漏洞以及完整验证的相关运行时成本)方面的持续困难使其成为一个无用的功能继续拥有。

堆栈映射和由于数据而启用的轻量级验证器在类加载期间是一个巨大的性能胜利,不会牺牲安全性。


10
2018-05-03 16:54



记录:安全漏洞不仅是潜在的,旧的Java版本中存在验证错误,其中使用SWAP字节码交换堆栈上的两个返回地址(JSR / JSR / SWAP / RET漏洞)导致类型混淆。 - mihi
在进入时具有一致的堆栈形状意味着什么? - KodeWarrior
JVM使用堆栈来表示操作的操作数。例如:iadd字节码需要堆栈上的2个整数,然后弹出,然后将这些整数加在一起。因此,成为一致的形状意味着在方法中的任何给定字节码位置,堆栈总是相同的深度,并且堆栈上的每个元素都是正确的类型(即:int vs reference等等)。 - Trent Gray-Donald