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

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

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

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

单步执行相应的代码,似乎是

形式的方法调用
myObj->method()

被执行,而myObj没有被初始化,即它的值为0x00000000。然后在第三方库的某个深处抛出这个错误。

这怎么可能发生?为什么不一调用就抛空引用异常?

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