与32位Windows SEH相比,基于表的异常处理如何更好?

时间:2019-01-28 10:22:10

标签: windows exception-handling abi seh

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

64-bit WindowsItanium / System V x86-64 ABI中,展开都使用大的排序列表来描述内存中的所有功能。每个每个函数的运行时开销是一些表(不只是涉及异常处理的表),complications用于动态生成的代码,并且在处理异常时,每次活动时都要遍历一次函数列表函数不管是否与异常有关。

后者比前者好吗?我了解为什么Itanium模型在一般情况下比基于setjmp / longjmp的传统UNIX便宜,但是有几个PUSHPOP加上一些在32位Windows中注册溢出似乎没有那么糟糕,因为它提供的(貌似)更快,更简单的处理。 (IIRC,Windows API调用通常会占用Ks的堆栈空间,因此,就像我们通过强制将这些数据输出到表中获得的任何东西一样。)

1 个答案:

答案 0 :(得分:0)

除了优化幸福的情况之外,也许还存在缓冲区溢出漏洞可能在异常中公开信息的问题。如果此信息被破坏,可能会严重混淆用户,甚至可能导致进一步的错误(请记住,如果引发另一个异常,则调用std :: terminate())。

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