Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
sidezzz
0 / 0 / 0
Регистрация: 13.10.2016
Сообщений: 9
#1

Выйти за пределы стэка - C++

21.06.2017, 16:17. Просмотров 448. Ответов 31
Метки нет (Все метки)

Короче дали задание выйти за пределы стэка. Как переполнить стэк я знаю (запустить бесконечную рекурсивную функцию), но надо именно выйти за пределы стэка и я не особо понимаю как это вообще сделать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.06.2017, 16:17
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Выйти за пределы стэка (C++):

Выйти указателем за пределы памяти программы - C++
Создаю я переменные int x = 0; int* xpp; затем ну можно по нажатию можно циклом буду выводить адрес ... xpp = &x + i; ...

Размер стэка и кучи - C++
Насколько я знаю, куча и стек растут в направлении друг-дружки в общей куче. Однако, я с удивление обнаружил, что выделить локальный массив...

Переполнение стэка при рекурсии - C++
вот код: #include <iostream> using namespace std; void Vvod (int *A, int n) { for (int i=0;i<n;i++) { cin>>A; ...

Стэк. Нужно определить, сколько элементов стэка, начиная с вершины, находятся до элемента с максимальным значениям - C++
У меня такая задачка: Определить структуру стэка и разработать функции, необходимые для роботы с заданным контейнером: ф-ию суммы элементов...

Выйти из goto. - C++
Работаю в С++. Было задание написать программу с использованием goto. Вот код: ...

Как выйти из оператора if - C++
Пишу ИИ для крестиков-ноликов и вопрос в том, если исполниться одино условие как сделать так что бы другие не проверялись? break чето в...

31
karaulov6
-42 / 23 / 2
Регистрация: 23.03.2013
Сообщений: 241
Завершенные тесты: 2
22.06.2017, 17:50 #16
Kastaneda переполнение это когда выходит за пределы стека, одно и тоже, или нет?!

дайте почитать чем отличается выход за пределы и переполнение
0
stima
490 / 342 / 40
Регистрация: 22.03.2011
Сообщений: 1,095
Завершенные тесты: 2
22.06.2017, 18:07 #17
Цитата Сообщение от Kastaneda Посмотреть сообщение
У тебя указатель стека сдвинется, опять же будет переполнение, но не выход за пределы.
Что Вами подразумевается под выходом за пределы стека? Обращение к памяти за пределами стека?
0
Kastaneda
Jesus loves me
Эксперт С++
4689 / 2893 / 236
Регистрация: 12.12.2009
Сообщений: 7,355
Записей в блоге: 2
Завершенные тесты: 1
22.06.2017, 18:24 #18
karaulov6, stima,
я рассуждаю так:
выход за пределы стека - доступ к памяти за пределами адреса в [e|r]sp
переполнение стека - адрес в [e|r]sp корректный, но стековая память закончилась (мы залезли на желтые или красные страницы стека).

[e|r]sp - это регистр (ESP или RSP или SP), где лежит адрес верхушки стека
0
karaulov6
-42 / 23 / 2
Регистрация: 23.03.2013
Сообщений: 241
Завершенные тесты: 2
22.06.2017, 19:44 #19
Kastaneda, допустим есть 5мб стека

локальная переменная int val[0xFFFFFF] 100% при выделении этой памяти, будет выход за пределы стека в 100% случаях.

А будет ли это переполнением стека?


в асм это будет выглядеть как sub esp, 0xFFFFFF вроде как?(ну примерно)
0
Renji
1999 / 1367 / 308
Регистрация: 05.06.2014
Сообщений: 3,899
22.06.2017, 20:10 #20
Цитата Сообщение от karaulov6 Посмотреть сообщение
А будет ли это переполнением стека?
Нет. Для вызова stack overflow надо попасть по PAGE_GUARD странице, которая обычно располагается сразу за выделенной под стек памятью. Дальше ОС либо выдаст под эту страницу еще немножко памяти (переполнения не вышло), либо матюкнется (вышло). А если просто прибавить в ESP очень много, то можно пролететь аж до глобальных данных программы. Сомневаюсь, что это то что было нужно ТС.
1
Kastaneda
Jesus loves me
Эксперт С++
4689 / 2893 / 236
Регистрация: 12.12.2009
Сообщений: 7,355
Записей в блоге: 2
Завершенные тесты: 1
23.06.2017, 08:09 #21
Цитата Сообщение от karaulov6 Посмотреть сообщение
локальная переменная int val[0xFFFFFF] 100% при выделении этой памяти, будет выход за пределы стека в 100% случаях.
будет переполнение стека)

Выход за пределы - SP = 100, мы читаем по адресу 99 (за стеком), стек растет в сторону уменьшения адресов
Переполнение - пробуем в SP записать мега большое число, залазием на чужую память или вообще памяти не хватает
0
karaulov6
-42 / 23 / 2
Регистрация: 23.03.2013
Сообщений: 241
Завершенные тесты: 2
23.06.2017, 08:30 #22
За пределы это допустим стек по адресам 0x10000-0xF0000, если адрес меньше или больше этого, то это выход за пределы. (по мне так это очень даже логично)


Так почему же локальная переменная с размером больше стека не будет выходом за пределы?

По мне так постепенное увеличение это переполнение, а мгновенный выход за пределы это и есть выход за пределы



Ну так что по вашему является выходом за пределы? (приведите пример)
0
ValeryS
Модератор
6709 / 5118 / 482
Регистрация: 14.02.2011
Сообщений: 17,203
23.06.2017, 08:32 #23
Цитата Сообщение от Renji Посмотреть сообщение
Для вызова stack overflow надо попасть по PAGE_GUARD странице,
а вот у меня камень stm32f103 и никакой ОС, следовательно никакого менеджера памяти, на какую страницу я попаду?
По моему мнению в общем случае на вопрос
Цитата Сообщение от sidezzz Посмотреть сообщение
выйти за пределы стэка.
ответ никак
ибо есть область глобальных переменных, локальных и куча
в языке никак не регламентируется их размер и пересечения
а в частности, нужно смотреть на процессор,его карту памяти, ОС,.....
есть процессоры с аппаратным стеком
0
karaulov6
-42 / 23 / 2
Регистрация: 23.03.2013
Сообщений: 241
Завершенные тесты: 2
23.06.2017, 08:34 #24
Ну если он учится за виндой, то наверно имелось ввиду выйти за пределы стека в винде ?)))
0
ValeryS
Модератор
6709 / 5118 / 482
Регистрация: 14.02.2011
Сообщений: 17,203
23.06.2017, 08:50 #25
Цитата Сообщение от karaulov6 Посмотреть сообщение
за пределы стека в винде ?
наверно
но ветка называется "С++ для начинающих"
А плюсы портированы под стопитсот платформ
0
Renji
1999 / 1367 / 308
Регистрация: 05.06.2014
Сообщений: 3,899
23.06.2017, 09:50 #26
Цитата Сообщение от karaulov6 Посмотреть сообщение
Так почему же локальная переменная с размером больше стека не будет выходом за пределы?
По мне так постепенное увеличение это переполнение, а мгновенный выход за пределы это и есть выход за пределы
Потому что при создании локальной переменной будет постепенное увеличение стека, с простукиванием тех самых PAGE_GUARD страниц. Соответственно, где-то в середине простукивание прилетит переполнение.
0
ValeryS
Модератор
6709 / 5118 / 482
Регистрация: 14.02.2011
Сообщений: 17,203
23.06.2017, 10:26 #27
Цитата Сообщение от sidezzz Посмотреть сообщение
Короче дали задание выйти за пределы стэка.
А вопрос точно об организации памяти? а не об организации данных?
0
karaulov6
-42 / 23 / 2
Регистрация: 23.03.2013
Сообщений: 241
Завершенные тесты: 2
23.06.2017, 21:59 #28
Цитата Сообщение от Renji Посмотреть сообщение
Потому что при создании локальной переменной будет постепенное увеличение стека, с простукиванием тех самых PAGE_GUARD страниц. Соответственно, где-то в середине простукивание прилетит переполнение.
Будет одна инструкция, sub esp, какое-то значение. Мгновенно!

https://godbolt.org/g/dK7kP3
0
Renji
1999 / 1367 / 308
Регистрация: 05.06.2014
Сообщений: 3,899
23.06.2017, 23:10 #29
Цитата Сообщение от karaulov6 Посмотреть сообщение
Будет одна инструкция, sub esp, какое-то значение. Мгновенно!
Если запрошено больше страницы, то не будет. Будет один вызов _chkstk, который будет читать по байту с каждой запрошенной из стека страницы. Костылик необходимый ввиду особенностей передачи стеку физической памяти.
0
karaulov6
-42 / 23 / 2
Регистрация: 23.03.2013
Сообщений: 241
Завершенные тесты: 2
24.06.2017, 07:26 #30
Ну почему-то по ссылке видно что одна инструкция вызовет выход за пределы стека.

https://godbolt.org/g/YB9SjL

C++
1
2
3
4
5
6
7
int Test( int ad,int a3 )
{
  int stackfail[0xFFFFFF];
  int stackfail2[0xFFFFFF];
 
  return stackfail2[200] + stackfail[2000];
}
C++
1
2
3
4
5
6
7
8
9
        Test(int, int):
        push    ebp
        mov     ebp, esp
        sub     esp, 134217728
        mov     edx, DWORD PTR [ebp-134216920]
        mov     eax, DWORD PTR [ebp-67100860]
        add     eax, edx
        leave
        ret
mov edx, DWORD PTR [ebp-134216920]

попытается прочитать локальную переменную за пределами стека.
0
24.06.2017, 07:26
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.06.2017, 07:26
Привет! Вот еще темы с ответами:

Не получается выйти из программы - C++
Всю голову сломала ! Почему while (str != NULL) не реагирует на (str != NULL) и не терминирует - что делать? Кто нибудь! #include...

Как выйти из цикла while(); - C++
#include <iostream> #include <fstream> #include <cctype> #include <string> #include <vector> using namespace std; int main()...

Выйти из нескольких функций - C++
Необходимо при определенном условии выскочить из косвенной рекурсии. Конечно, можно сделать это монструозно, но, полагаю, есть возможность...

как выйти из программы - C++
при выполнении программы - выполняется выбранная операция, после чего при нажатии любой кнопки цикл повторяется... вопрос: Что нужно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru