Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
sidezzz
0 / 0 / 0
Регистрация: 13.10.2016
Сообщений: 9
#1

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

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

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

Выйти указателем за пределы памяти программы
Создаю я переменные int x = 0; int* xpp; затем ну можно по нажатию можно...

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

Переполнение стэка при рекурсии
вот код: #include <iostream> using namespace std; void Vvod (int *A, int...

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

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

Выйти с внешнего цикла
Всем привет,смотрите,есть вот такой вот код char fin; int pov;...

31
Kastaneda
Jesus loves me
Эксперт С++
4760 / 2963 / 341
Регистрация: 12.12.2009
Сообщений: 7,524
Записей в блоге: 2
Завершенные тесты: 1
23.06.2017, 08:09 #21
Цитата Сообщение от karaulov6 Посмотреть сообщение
локальная переменная int val[0xFFFFFF] 100% при выделении этой памяти, будет выход за пределы стека в 100% случаях.
будет переполнение стека)

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


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

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



Ну так что по вашему является выходом за пределы? (приведите пример)
0
ValeryS
Модератор
7131 / 5399 / 669
Регистрация: 14.02.2011
Сообщений: 18,221
23.06.2017, 08:32 #23
Цитата Сообщение от Renji Посмотреть сообщение
Для вызова stack overflow надо попасть по PAGE_GUARD странице,
а вот у меня камень stm32f103 и никакой ОС, следовательно никакого менеджера памяти, на какую страницу я попаду?
По моему мнению в общем случае на вопрос
Цитата Сообщение от sidezzz Посмотреть сообщение
выйти за пределы стэка.
ответ никак
ибо есть область глобальных переменных, локальных и куча
в языке никак не регламентируется их размер и пересечения
а в частности, нужно смотреть на процессор,его карту памяти, ОС,.....
есть процессоры с аппаратным стеком
0
karaulov6
23 / 23 / 6
Регистрация: 23.03.2013
Сообщений: 243
Завершенные тесты: 2
23.06.2017, 08:34 #24
Ну если он учится за виндой, то наверно имелось ввиду выйти за пределы стека в винде ?)))
0
ValeryS
Модератор
7131 / 5399 / 669
Регистрация: 14.02.2011
Сообщений: 18,221
23.06.2017, 08:50 #25
Цитата Сообщение от karaulov6 Посмотреть сообщение
за пределы стека в винде ?
наверно
но ветка называется "С++ для начинающих"
А плюсы портированы под стопитсот платформ
0
Renji
2129 / 1488 / 453
Регистрация: 05.06.2014
Сообщений: 4,329
23.06.2017, 09:50 #26
Цитата Сообщение от karaulov6 Посмотреть сообщение
Так почему же локальная переменная с размером больше стека не будет выходом за пределы?
По мне так постепенное увеличение это переполнение, а мгновенный выход за пределы это и есть выход за пределы
Потому что при создании локальной переменной будет постепенное увеличение стека, с простукиванием тех самых PAGE_GUARD страниц. Соответственно, где-то в середине простукивание прилетит переполнение.
0
ValeryS
Модератор
7131 / 5399 / 669
Регистрация: 14.02.2011
Сообщений: 18,221
23.06.2017, 10:26 #27
Цитата Сообщение от sidezzz Посмотреть сообщение
Короче дали задание выйти за пределы стэка.
А вопрос точно об организации памяти? а не об организации данных?
0
karaulov6
23 / 23 / 6
Регистрация: 23.03.2013
Сообщений: 243
Завершенные тесты: 2
23.06.2017, 21:59 #28
Цитата Сообщение от Renji Посмотреть сообщение
Потому что при создании локальной переменной будет постепенное увеличение стека, с простукиванием тех самых PAGE_GUARD страниц. Соответственно, где-то в середине простукивание прилетит переполнение.
Будет одна инструкция, sub esp, какое-то значение. Мгновенно!

https://godbolt.org/g/dK7kP3
0
Renji
2129 / 1488 / 453
Регистрация: 05.06.2014
Сообщений: 4,329
23.06.2017, 23:10 #29
Цитата Сообщение от karaulov6 Посмотреть сообщение
Будет одна инструкция, sub esp, какое-то значение. Мгновенно!
Если запрошено больше страницы, то не будет. Будет один вызов _chkstk, который будет читать по байту с каждой запрошенной из стека страницы. Костылик необходимый ввиду особенностей передачи стеку физической памяти.
0
karaulov6
23 / 23 / 6
Регистрация: 23.03.2013
Сообщений: 243
Завершенные тесты: 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
Kastaneda
Jesus loves me
Эксперт С++
4760 / 2963 / 341
Регистрация: 12.12.2009
Сообщений: 7,524
Записей в блоге: 2
Завершенные тесты: 1
24.06.2017, 07:55 #31
Цитата Сообщение от karaulov6 Посмотреть сообщение
попытается прочитать локальную переменную за пределами стека.
нет же)
134216920 меньше, чем 134217728, поэтому выхода за пределы не будет.
0
karaulov6
23 / 23 / 6
Регистрация: 23.03.2013
Сообщений: 243
Завершенные тесты: 2
24.06.2017, 14:09 #32
Если размер стека будет например 50000000 (~50мб)

То откуда возьмутся данные по адресу [ebp-134216920] ? )))))
0
24.06.2017, 14:09
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.06.2017, 14:09
Привет! Вот еще темы с решениями:

как выйти из циклов
#include "stdafx.h" #include <stdio.h> #include <conio.h> #include <math.h>...

Как выйти из программы
Написав щось подібне калькулятору. Але що написати щоб вийти з консолі?? буду...

Не получается выйти из программы
Всю голову сломала ! Почему while (str != NULL) не реагирует на (str != NULL)...

как выйти из программы
при выполнении программы - выполняется выбранная операция, после чего при...


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

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

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