Windows x64调用约定Epilogue限制的深层原因是什么?
Windows x64调用约定中Epilogue限制的实际原因与疑问
引用MSDN文档:
Epilogue代码必须遵循严格规则,才能让unwind代码可靠地处理异常和中断。这些规则减少了所需的unwind数据量,因为无需额外数据描述每个Epilogue,unwind代码只需扫描代码流即可识别正在执行的Epilogue。
我能理解这段表述的字面含义,但对它在异常处理上的实际影响存在疑问。从合规Epilogue允许的指令示例来看:
lea RSP, -128[R13] ; epilogue proper starts here add RSP, fixed-allocation-size pop R13 pop R14 pop R15 ret
这些操作似乎都不会触发可恢复异常:pop可能导致栈下溢,但此时已无有效返回地址,根本无法正常展开;如果RSP指向无效内存,ret也无法正常执行,最多触发函数的顶级SEH处理程序。
那这些限制难道仅仅是为了支持中断?还是我漏掉了合规Epilogue可能触发异常的场景?如果只是为了避免Epilogue中出现异常,根本不需要通过扫描代码流来判断异常是否发生在Epilogue内的机制。
我的实际背景是:在进行原生代码栈切换时,生成了技术上不符合规范的Epilogue(以及部分Prolog),需要确认——如果能确保不会出现可恢复异常,这种不合规的写法会不会给普通用户态应用带来意外副作用?
内容的提问来源于stack exchange,提问作者Juliean
相关产品推荐
相关产品推荐

