Инструменты для борьбы с повреждением стека в C++

EDIT: из-за комментария, который был прав о моем примере, я удалил его и превратил это в общий вопрос:

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

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

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

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

2 ответов


это далеко не неясно, что у вас есть стек коррупция. Но я признаю, что есть некоторая порча данных.

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

...
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.
}

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


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

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