gpt4 book ai didi

windows - 基于表的异常处理与 32 位 Windows SEH 相比有何优势?

转载 作者:行者123 更新时间:2023-12-03 11:07:40 24 4
gpt4 key购买 nike

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

在两个64-bit WindowsItanium / System V x86-64 ABI ,unwinding 而是使用一个大的排序列表来描述内存中的所有函数。运行时成本是每个每个 函数的一些表(不仅仅是那些涉及异常处理的表),complications对于动态生成的代码,在处理异常时,对每个事件函数遍历一次函数列表,不管它是否与异常有关。

后者比前者好在哪里?我理解为什么 Itanium 模型在常见情况下比基于 setjmp/longjmp 的传统 UNIX 模型便宜,但是一些 PUSHes和POP 加上 32 位 Windows 中的一些寄存器溢出似乎并没有那么糟糕,因为它提供了(看似)更快和更简单的处理。 (IIRC,无论如何,Windows API 调用通常会消耗 Ks 的堆栈空间,因此我们不会通过将这些数据强制输出到表中来获得任何好处。)

最佳答案

除了优化happy case之外,或许还有一个顾虑就是缓冲区溢出漏洞会暴露异常中的信息。如果此信息被破坏,可能会严重混淆用户,甚至可能导致更多错误(请记住,如果抛出另一个异常,则会调用 std::terminate())。

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

关于windows - 基于表的异常处理与 32 位 Windows SEH 相比有何优势?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54399851/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com