首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于表的异常处理如何比32位Windows更好?

基于表的异常处理如何比32位Windows更好?
EN

Stack Overflow用户
提问于 2019-01-28 10:22:10
回答 1查看 420关注 0票数 3

在32位Windows (至少使用微软编译器)中,异常处理已实现使用调用堆栈上动态分配的异常帧堆栈;异常堆栈的顶部由一个TIB条目指向。运行时成本是每个函数需要处理异常的两个PUSH/POP指令,将异常处理程序访问的变量溢出到堆栈上,并且在处理异常时,使用简单的链表遍历。

64位WindowsItanium /V x86-64 ABI系统中,展开都使用一个大的排序列表来描述内存中的所有函数。运行时成本是每个函数(不只是涉及异常处理的函数)、动态生成代码的并发症表,在处理异常时,每一个活动函数都要遍历一次函数列表,而不管它是否与异常有关。

后者如何比前者更好?我理解为什么在普通情况下,Itanium模型比基于setjmp/longjmp的传统PUSH模型更便宜,但是一些PUSHes和POPs加上32位Windows中的一些寄存器溢出似乎并没有那么糟糕,因为它提供了(似乎)更快、更简单的处理方式。(IIRC,Windows API调用通常会占用K的堆栈空间,所以我们不能通过将这些数据强制输出到表中来获得任何信息。)

EN

回答 1

Stack Overflow用户

发布于 2020-04-12 02:30:44

除了优化愉快的情况外,可能还担心缓冲区溢出漏洞可能会暴露异常中的信息。如果该信息被破坏,它可能会严重混淆用户,甚至可能导致进一步的错误(请记住,如果抛出另一个异常,则调用std::终止())。

来源:http://www.osronline.com/article.cfm%5earticle=469.htm

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54399851

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档