我知道jmp指令已经有一段时间了,但是它从来没有让我觉得不安全。最近我查看了CIL规范,非常惊讶地发现jmp被认为是不可验证的。
我知道jmp指令已经有一段时间了,但是它从来没有让我觉得不安全。最近我查看了CIL规范,非常惊讶地发现jmp被认为是不可验证的。
call
、callvirt
或calli
不同,调用者的堆栈框架将保留在堆栈上,以供由被调用方触发的未来代码访问安全性堆栈步行器看到,而jmp
指令在转换为被调用方之前会拆除调用者的堆栈框架,因此对于被调用方可能触发的任何CAS堆栈步行器都是不可见的。jmp
需要评估堆栈为空,并导致跳转者继承跳转者的参数。可能没有理由复杂化验证器以检查jmp
指令,但是在类似于强加于tail.call
序列的条件下可能是可能的(其中之一是调用者和被调用者必须在同一个程序集中,这排除了我的CAS猜测,至少直到显式.Deny()
调用)。如果是这样,这将是规范的相关部分:(第III部分,第3.37节)当前参数被传输到目标方法。执行此指令时,评估堆栈必须为空。目标地址处的调用约定、参数数量和类型必须与当前方法相匹配。