FeelUs
|
|
« : 12-08-2011 20:17 » |
|
можно ли (если да, то как) узнать, что при вызове след. функции или при входе в след. блок произойдет переполнение стека? //кроме как суммировать sizeof всех переменных (и адресов возврата, что записываются в сек перед вызовом ф-ции) или как-нибудь перехватить это исключением?
|
|
|
Записан
|
|
|
|
RXL
Технический
Администратор
Online
Пол:
|
|
« Ответ #1 : 12-08-2011 20:19 » |
|
А если переписать алгоритм на итеративный?
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
FeelUs
|
|
« Ответ #2 : 12-08-2011 20:22 » |
|
не, а если не переписывать
|
|
|
Записан
|
|
|
|
RuNTiME
|
|
« Ответ #3 : 12-08-2011 20:34 » |
|
FeelUs, Проверять значение регистра ESP. В нем содержится текущее смещение в стеке.
|
|
|
Записан
|
Любимая игрушка - debugger ...
|
|
|
FeelUs
|
|
« Ответ #4 : 12-08-2011 20:38 » |
|
О, точно, спасибо, а как его получить, и с чем сравнивать?
|
|
|
Записан
|
|
|
|
RuNTiME
|
|
« Ответ #5 : 12-08-2011 20:45 » |
|
FeelUs, Ну например можно так получить: unsigned int esp_val;
_asm { mov esp_val, esp }; Только я бы на твоем месте не возился с размером стека, т.к. его размер определяется реализацией операционной системы и может меняться от версии к версии. Лучше перепиши алгоритм...
|
|
|
Записан
|
Любимая игрушка - debugger ...
|
|
|
FeelUs
|
|
« Ответ #6 : 13-08-2011 05:46 » |
|
т.е. размер стека определяется не на этапе компиляции а на этапе выполнения?
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #7 : 13-08-2011 06:12 » |
|
На этапе линковки можно задать параметр, который будет определять минимальный размер стека для программы. А реальный размер стека определяется ОС.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
FeelUs
|
|
« Ответ #8 : 13-08-2011 06:47 » |
|
а вообще операционная система ведь проверяет, не обратилась ли программа к нетой области памяти, не переполнился ли у нее стек, зачем она заставляет программу делать тоже самое ещё раз? //наверно, она предполагает, что программа не должна делать проверку еще раз и при этом у нее не должны случаться такие ситуации... неужели она не может, если заметила подобное поведение у программы, не аварийно закрывать ее, а как-нибудь сообщить об этом в программу? //я конечно понимаю, что все это довольно сложно, и врядли такое есть в винде, но может это есть в других ОС? : а кстати что за параметр (в MSVC2008)? или чему он равен по умолчанию?
|
|
« Последнее редактирование: 13-08-2011 06:55 от FeelUs »
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #9 : 13-08-2011 06:55 » |
|
FeelUs, Что то ты сумбурно пишешь. Такое ощущение, что разговариваешь сам с собой. Добавлено через 3 минуты и 54 секунды:Вот параметр для установки минимального требуемого размера стека для программы. http://msdn.microsoft.com/en-us/library/8cxs58a6(v=vs.80).aspx
|
|
« Последнее редактирование: 13-08-2011 06:59 от Finch »
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
FeelUs
|
|
« Ответ #10 : 13-08-2011 06:59 » |
|
прям порассуждать нельзя
|
|
|
Записан
|
|
|
|
RuNTiME
|
|
« Ответ #11 : 13-08-2011 07:27 » |
|
FeelUs, Если бы операционные системы отслеживали стек, то одной из самых коварных уязвимостей типа "Переполнение стека (переполнение буфера размещенного в стеке)" просто не существовало. Но чтобы реализовать проверку на переполнение стека потребовалось бы проверять каждую попытку программы выделить память в стеке. А это происходит настолько часто, что любая даже самая простейшая проверка превратит современный компьютер в доисторический калькулятор... И по этому память в стеке выделяется и освобождается всего одной командой процессора: mov eax, 4 ;поместили в регистр eax число 4 push eax ;выделили в стеке 4 байта pop eax ;освободили в стеке 4 байта
|
|
|
Записан
|
Любимая игрушка - debugger ...
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #12 : 13-08-2011 08:07 » |
|
RuNTiME, Частично не верно ОС отслеживает переполнение стека в целом. Т.е Вышел ли указатель вершины стека за пределы пула стека. А что творится внутри пула стека ОС никак не волнует. Это дело лежит полностью на совести программиста.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
FeelUs
|
|
« Ответ #13 : 13-08-2011 09:46 » |
|
правильно, при выполнении push eax; не переполнился ли стек проверяет процессор , и если переполнение произошло, происходит прерывание (или что-то вроде того) и управление передается ОС (т.е. это поддерживается аппаратно) иначе как ОС понимает, что произошло переполнение стека или обращение к нетой ячейке памяти чтобы закрыть программу
|
|
|
Записан
|
|
|
|
RuNTiME
|
|
« Ответ #14 : 13-08-2011 10:02 » |
|
Finch, FeelUs, точно - точно, подзабыл нюансы работы ОС с памятью. Вспомнил тут про Structured Exception Handling. С его помощью можно ловить те самые исключения, которые генерирует ОС на прерывание переполнения. Почитать об этом можно тут: http://www.insidepro.com/kk/014/014r.shtml
|
|
« Последнее редактирование: 13-08-2011 10:07 от RuNTiME »
|
Записан
|
Любимая игрушка - debugger ...
|
|
|
|
RXL
Технический
Администратор
Online
Пол:
|
|
« Ответ #16 : 13-08-2011 16:22 » |
|
Не знаю, что там в винде, а насчет Линукса мы еще семь лет назад разбирали: в конце стековой области процесса имеется специальная страница, при записи в которую происходит исключение и ядро выделяет еще одну страницу. Максимальный размер стека регулируется лимитами.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
PredatorAlpha
Помогающий
Offline
|
|
« Ответ #17 : 13-08-2011 16:43 » |
|
Не знаю, что там в винде, а насчет Линукса мы еще семь лет назад разбирали: в конце стековой области процесса имеется специальная страница, при записи в которую происходит исключение и ядро выделяет еще одну страницу. Максимальный размер стека регулируется лимитами.
А если кто-то решит передать большой объект по значению? Размером, этак, в 8К. Копировать его компилятор будет, естественно, с младших адресов...
|
|
|
Записан
|
|
|
|
RXL
Технический
Администратор
Online
Пол:
|
|
« Ответ #18 : 13-08-2011 16:47 » |
|
PredatorAlpha, если очень интересно - загляни в исходники ядра Линукс. Я это делал давно (тогда - 7 лет назад) и всю полноту картины не помню. А еще проще - написать тест по твоим условиям. Думаю, он сработает.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
|