代码之家  ›  专栏  ›  技术社区  ›  naasking

为什么CLR的jmp指令无法验证?

  •  14
  • naasking  · 技术社区  · 16 年前

    was very surprised to discover jmp is considered unverifiable

    1 回复  |  直到 14 年前
        1
  •  4
  •   Doug McClean    16 年前

    call , callvirt ,或 calli ,其中调用者的堆栈帧将保留在堆栈上,以供被调用者触发(可能是间接地)的未来代码访问安全stackwalks看到 jmp

    编辑:我认为naasking是对的,上面的答案是错的。 我现在认为(可验证的)tail.call序列和(不可验证的)jmp序列之间的区别可能是,tail调用需要将调用的参数推送到求值堆栈上,在求值堆栈上它们可以以正常方式进行验证,而 jmp公司 jmp公司 tail.call 序列(其中之一是调用者和被调用者必须在同一个程序集中,这排除了我上面的CAS猜测,至少到显式 .Deny( )

    如果是这样,这将是规范的相关部分:(第三部分,第3.37节)

    当前参数已转移 到目标方法。

    执行此指令时。这个 呼叫惯例、号码和类型 必须与当前方法的匹配。