Повреждение стека в C++

(5G|4G)\sDL\s(\d*[.]?\d*)\sUP\s(\d*[.]?\d*)

с флагами gi (глобальные, без учета регистра) должны работать. Вы можете изменить сопоставление цифр, так как я не уверен, обязательно ли это десятичное число или нет.

18
задан Naveen 5 April 2009 в 07:12
поделиться

6 ответов

  1. У Вас мог быть случайный/неопределенный указатель, который заканчивает тем, что указал на стек, и запишите хотя это.
  2. Функция блока могла неправильно установить/изменить/восстановить стек
  3. Космические волны могли биты зеркальных отражений в стеке.
  4. Радиоактивные элементы в преобразовании регистра микросхемы могли зеркально отразить биты.
  5. Что-либо в ядре могло пойти не так, как надо и случайно изменить Вашу стековую память.

Но это не конкретно к C++, который не имеет никакой идеи стека.

31
ответ дан 30 November 2019 в 05:38
поделиться

Стандарт C++ не определяет стек/"кучу". Далее, существует много способов вызвать неопределенное поведение в программе - все из которых могут повредить Ваш стек (это - UB, в конце концов). Короткий ответ - Ваш вопрос слишком неопределенен, чтобы иметь значимый ответ.

9
ответ дан 30 November 2019 в 05:38
поделиться

Нарушения Одного Правила Определения могут вести для укладки повреждения. Следующий пример выглядит глупым, но я видел его пару раз с различными библиотеками, скомпилированными в различных конфигурациях.

header.h

struct MyStruct
{
   int val;
#ifdef LARGEMYSTRUCT
   char padding[16];
#endif
}

file1.cpp

#define LARGEMYSTRUCT
#include "header.h"

//Here it looks like MyStruct is 20 bytes in size    

void func(MyStruct s)
{
   memset(s.padding, 0, 16); //corrupts the stack as below file2.cpp does not have LARGEMYSTRUCT declared and declares Mystruct with 4 bytes
   return; //Will probably crash here as the return pointer has been overwritten
}

file2.cpp

#include "header.h"
//Here it looks like MyStruct is only 4 bytes in size.
extern void func(MyStruct s);

void caller()
{
   MyStruct s;
   func(s); //push four bytes on to the stack
}
31
ответ дан 30 November 2019 в 05:38
поделиться

Вызывание функции с неправильным соглашением о вызовах.

(хотя это является технически определенным для компилятора, не вопрос C++, каждый компилятор C++ должен иметь дело с этим.)

5
ответ дан 30 November 2019 в 05:38
поделиться

Взятие указателей для укладки переменных является хорошим путем:

void foo()
{
  my_struct s;
  bar(&s);
}

Если панель сохраняет копию указателя затем, что-либо может произойти в будущем.

Подведение итогов: повреждение Стека происходит, когда существуют случайные указатели, указывающие на стек.

15
ответ дан 30 November 2019 в 05:38
поделиться

Хорошим кандидатом является создание исключения внутри деструктора. Это испортит раскручивание стека.

4
ответ дан 30 November 2019 в 05:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: