如何处理这个异常?
__asm
{
mov esp, 0
mov eax, 0
div eax
}
这不是用 try/except
或 SetUnhandledExceptionFilter()
处理的。
最佳答案
假设它在操作系统中运行,操作系统将捕获除以零,然后尝试为应用程序代码形成异常/信号栈帧。然而,由于用户模式栈是“坏的”,它不能。
除了杀死应用程序之外,操作系统真的没有办法处理这个问题。 [从理论上讲,可以从一些动态分配的内存中组成一个新堆栈,但这毫无意义,因为没有(始终有效的)应用程序本身可以恢复到正常状态的方法]。
不要将堆栈指针设置为不是堆栈的东西 - 或者如果您确实将“随机”数据存储在堆栈指针寄存器中,则没有异常(exception)。这与“不要把枪对准你的脚并扣动扳机,除非你想没有你的脚”是一样的。
编辑:
如果代码在“内核模式”而不是“用户模式”下运行,它甚至更像是“游戏结束”,因为它会“双重故障”——处理器遇到被零除的异常处理程序,它会尝试编写到堆栈,当它这样做时,它会出错。现在这是“错误处理程序中的错误”,也称为“双重错误”。双故障处理程序的典型设置是有一个单独的堆栈,然后恢复故障处理程序。但游戏还是结束了——我们不知道如何返回到原始故障处理程序[或如何找出原始故障处理程序是什么]。
如果双重故障处理程序没有“新堆栈”,它将使 x86 处理器出现三次故障 - 通常,三次故障将使处理器重新启动 [从技术上讲,它会通过特殊的位组合停止处理器地址总线以指示它是“三重故障”。典型的 PC 北桥然后重置处理器,以识别三重故障是不可恢复的情况 - 这就是为什么有时当您的驱动程序质量差时,您的 PC 只是重启]。
关于c++ - 如何处理这个异常? (零特别是),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16937932/