在32位Windows (至少使用微软编译器)中,异常处理已实现使用调用堆栈上动态分配的异常帧堆栈;异常堆栈的顶部由一个TIB条目指向。运行时成本是每个函数需要处理异常的两个PUSH/POP指令,将异常处理程序访问的变量溢出到堆栈上,并且在处理异常时,使用简单的链表遍历。
在64位Windows和Itanium /V x86-64 ABI系统中,展开都使用一个大的排序列表来描述内存中的所有函数。运行时成本是每个函数(不只是涉及异常处理的函数)、动态生成代码的并发症表,在处理异常时,每一个活动函数都要遍历一次函数列表,而不管它是否与异常有关。
后者如何比前者更好?我理解为什么在普通情况下,Itanium模型比基于setjmp/longjmp的传统PUSH模型更便宜,但是一些PUSHes和POPs加上32位Windows中的一些寄存器溢出似乎并没有那么糟糕,因为它提供了(似乎)更快、更简单的处理方式。(IIRC,Windows API调用通常会占用K的堆栈空间,所以我们不能通过将这些数据强制输出到表中来获得任何信息。)
发布于 2020-04-12 02:30:44
除了优化愉快的情况外,可能还担心缓冲区溢出漏洞可能会暴露异常中的信息。如果该信息被破坏,它可能会严重混淆用户,甚至可能导致进一步的错误(请记住,如果抛出另一个异常,则调用std::终止())。
来源:http://www.osronline.com/article.cfm%5earticle=469.htm
https://stackoverflow.com/questions/54399851
复制相似问题