Ошибка проверки времени выполнения № 2 - стек вокруг переменной поврежден C ++ - PullRequest
1 голос
/ 13 марта 2012

Вот код, который у меня есть:

#include <iostream>
#include <typeinfo.h>

typedef struct A
{

friend class W;

private:
        char c;
        void *v;
} A;

typedef struct LL
{

friend class W;

private:
        int n;
        LL *next, *prev;
} LL;

class W
{

private:
        void Handle(void *arg1, void *arg2)
        {
                A *ob1 = reinterpret_cast<A*>(arg1);
                ob1->c = 'c';
                ob1->v = (void*)0xffffffff;

                LL *ob2 = reinterpret_cast<LL*>(arg2);
                ob2->n = 0xff;
                ob2->next = new LL();
                ob2->prev = 0;
        }

protected:
        void Set()
        {
                A *ob1 = new A();
                LL *ob2 = new LL();

                this->Handle(&ob1, &ob2);
        }
};

class R : W
{

public:
        R(void)
        {
                this->Set();
        }
};

void main(void)
{
        R *ob = new R();
}

Я получаю следующий результат из дампа: Ошибка проверки времени выполнения # 2 - стек вокруг переменной 'ob2' поврежден.

'http.exe': загружен 'C: \ Users \ root \ Documents \ Visual Studio 2008 \ Projects \ http \ Debug \ http.exe'Символы загружены.'http.exe': загружен 'C: \ Windows \ SysWOW64 \ ntdll.dll''http.exe': загружено 'C: \ Windows \ SysWOW64 \ kernel32.dll''http.exe': загружен 'C: \ Windows \ SysWOW64 \ KernelBase.dll''http.exe': загружен 'C: \ Windows \ winsxs \ x86_microsoft.vc90.debugcrt_1fc8b3b9a1e18e3b_9.0.30729.1_none_bb1f6aa1308c35eb \ msvcr90d.dll'Ошибка проверки времени выполнения # 2 - стек вокруг переменной 'ob2' поврежден.

Мои вопросы: - Что я должен сделать, чтобы решить эту проблему?- Почему у меня такая ошибка, можете ли вы описать, почему ее испорчена?- А почему Стек поврежден?не куча?

Спасибо,С уважением,

1 Ответ

4 голосов
/ 13 марта 2012
A *ob1 = new A();
LL *ob2 = new LL();

this->Handle(&ob1, &ob2);

ob1 и ob2 уже являются указателями. Взяв адреса переменных (соответственно типов A** и LL**), затем передав их в Handle, где они вбиваются в A* и LL* с reinterpret_cast с, а затем записываются в , код вызывает неопределенное поведение. В этом конкретном случае он, кажется, записывает в местоположения рядом с переменными ob1 и ob2, которые, вероятно, находятся в кадре стека вызова Set.

Если вместо обработки системы типов с помощью reinterpret_cast код использовал ее правильно, компилятор сразу же обнаружил бы ошибку:

void Handle(A *arg1, LL *arg2)
{
        ob1->c = 'c';
        ob1->v = (void*)0xffffffff;

        ob2->n = 0xff;
        ob2->next = new LL();
        ob2->prev = 0;
}

// ...
// the compiler would complain about this call making the problem clear
this->Handle(&ob1, &ob2);

Было бы еще лучше, если бы код не использовал так много указателей повсюду, но я собираюсь предположить, что это был просто кусок кода, чтобы продемонстрировать проблему.

...