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

问题描述 投票:2回答:1

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

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

后者比前者好吗?我知道为什么Itanium模型在一般情况下比基于setjmp / longjmp的传统UNIX便宜,但是在32位Windows中,有几个PUSHPOP加上一些寄存器溢出,却没有对于它提供的(看似)更快,更简单的处理来说,似乎还不错。 (IIRC,Windows API调用通常会占用Ks的堆栈空间,因此,我们通过强制将这些数据输出到表中并不会获得任何收益。)

在32位Windows(至少使用Microsoft编译器)中,使用在调用堆栈上动态分配的异常帧堆栈来实现异常处理;异常堆栈的顶部是...

windows exception-handling abi seh
1个回答
0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.