Как нулевая ссылка может привести к исключению SEH с кодом 0xc0000005?

Я пишу тестовый код, используя Google C ++ Test Framework и забыл инициализировать определенный объект myObj, Это приводит к следующей ошибке.

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

Проходя по соответствующему коду, оказывается, что вызов метода вида

myObj->method()

выполняется, пока myObj не инициализирован, то есть его значение 0x00000000, Затем где-то глубоко в сторонней библиотеке эта ошибка выдается.

Как это может произойти? Почему он не генерирует исключение нулевой ссылки при вызове метода?

1

Решение

Как было справедливо указано в комментариях, вызов метода из неинициализированного указателя класса является неопределенным поведением, поэтому в зависимости от реализации компилятора может произойти все что угодно. Однако легко предсказать, почему в вашем случае исполнение было полууспешным. Единственная разница между классом (__thiscall) члены и порядковые функции, это то, что они получают дополнительный скрытый аргумент, содержащий указатель на экземпляр класса (this). Проходит компилятор Microsoft C ++ this спорить через ecx/rcx зарегистрироваться, другие компиляторы могут использовать другой подход. Однако, если ваш метод класса не пытается разыменовать недействительным this Указатель, исключение не будет выдано, и, в зависимости от логики метода, ваша программа может даже продолжить выполнение без ошибок. Все было бы по-другому, если бы вы попытались вызвать виртуальный метод. В этом случае ваша программа попытается вычислить правильный адрес метода, используя класс vtable, разыменовать неверный указатель и завершиться ошибкой с нарушением доступа, даже если сам метод не использует this указатель.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]