空引用如何导致代码0xc0000005的 SEH 异常

How can null reference result in SEH exception with code 0xc0000005?

本文关键字:SEH 异常 0xc0000005 代码 引用 何导致      更新时间:2023-10-16

我正在使用Google C++测试框架编写一些测试代码,但忘记初始化某个对象myObj。这会导致以下错误。

unknown file: error: SEH exception with code 0xc0000005 thrown in the test body

单步执行相应的代码时,似乎表单的方法调用

myObj->method()

被执行,而 myObj 未初始化,即其值为 0x00000000 。然后在第三方库深处的某个地方抛出此错误。

这怎么可能呢?为什么它不会在调用该方法后立即引发 null 引用异常?

正如注释中正确指出的那样,从未初始化的类指针调用方法是一种未定义的行为,因此任何事情都可能发生,具体取决于编译器实现。但是,很容易预测为什么在您的案例中执行是半成功的。类(__thiscall(成员和序数函数之间的唯一区别是它们接收额外的隐藏参数,其中包含指向类实例(this(的指针。Microsoft C++编译器通过寄存器传递this参数ecx/rcx,其他编译器可能会使用不同的方法。但是,如果您的类方法没有尝试取消引用无效的指针this则不会引发异常,并且根据方法逻辑,您的程序甚至可以继续执行而不会出错。如果您尝试调用虚拟方法,情况会大不相同。在这种情况下,您的程序将尝试使用类 vtable 计算正确的方法地址,取消引用无效指针并失败并因访问冲突而失败,即使方法本身未this使用指针也是如此。