Инструменты для борьбы с повреждением стека в C ++ - PullRequest
8 голосов
/ 18 января 2011

РЕДАКТИРОВАТЬ: Из-за комментария, который был прав насчет моего примера, я удалил его и превратил его в общий вопрос:

Иногда в моих проектах я сталкиваюсь с повреждением стека. Независимо от того, сколько я борюсь, чтобы написать код, чтобы избежать этого, иногда это просто неизбежно. Но когда это произойдет, как с этим бороться?

В этом блоге я нашел один макрос, данный хорошим парнем: http://rxwen.blogspot.com/2009/04/detect-stack-corruption.html, который считывает значение регистра ebp для обнаружения повреждения.

Но наверняка найдутся более изощренные инструменты, чтобы не выстрелить себе в ногу. Я программирую в Windows, используя Codeblocks и компилятор gcc. Причина, по которой я задаю этот вопрос, состоит в том, чтобы найти инструменты, которые я могу использовать в своей среде программирования, чтобы помочь мне обнаружить такие ошибки и исправить их. Какие-либо предложения?

Спасибо за любые ответы и за то, что нашли время прочитать мой вопрос.

Ответы [ 2 ]

4 голосов
/ 18 января 2011

Далеко не ясно, что у вас стек повреждение.Но я допускаю, что существует некоторая порча данных.

Достаточно эффективным методом является добавление защитных полей вокруг подозрительных полей:

...
long   namecheck1;
Artist artist;
long   namecheck2;
...

Пусть конструктор инициализирует их для чего угодно,но не зная природу искажения, что-то ненулевое кажется более удовлетворительным.

myclass::myclass() : namecheck1(0x12345678), namcheck2(0x12345678) ...

Добавьте функцию-член проверки согласованности:

void myclass::isokay()
{
       if (namecheck1 != namecheck2  ||
           namecheck2 != 0x12345678)
             cerr << "the object is corrupted";
         ... // maybe wait for input, cause core dump, etc.
}

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

1 голос
/ 18 января 2011

Valgrind обнаруживает все виды повреждения памяти.

В GCC есть mudflap (-fmudflap и друзья) и -fstack-protector для обнаружения проблем с доступом к памяти.Другие компиляторы, вероятно, тоже.

...