Проблема при отведении буфера c gcc v3.2.2

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
flux
Сообщения: 5
Зарегистрирован: 09 июн 2005, 16:50

09 июн 2005, 17:29

Прошу помочь кто знает что у меня происходит... Есть элементарная прога на C:

void function() {
char buffer[20];
char *ret;
return;
}
int main() {
function();
return;
}

Почему когда я отвожу буфер в 20 байт в ассемблерном коде я вижу следующее:

function:
pushl %ebp
movl %esp, %ebp
subl $56, %esp

56 байт... почему не 24? вроде буфер 5 слов и указатель 1... 6 в сумме получается...

RH Linux 9.0, gcc v3.2.2 compiler.
Eugie
Сообщения: 707
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

10 июн 2005, 01:28

Думаю, это какая-то минимальная защита на случай stack overflow. Т.е. фрейм создается 'с запасом', чтобы небольшое переполнение не разрушало стек напрочь. C/C++ компиляторы обычно встраивают в код возврата вызов спец. процедуру проверки целостности стека, типа _chkesp (VC++) - возможно, это требуется для нее.
flux
Сообщения: 5
Зарегистрирован: 09 июн 2005, 16:50

10 июн 2005, 10:43

Тогда просто я думаю этот размер должен быть статичным, проэксперементировав с размером буфера я просто так и не нашел на сколько он прибавляет стек... каждый раз разный размер и четкого алгоритма так я и не выявил...
Eugie
Сообщения: 707
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

12 июн 2005, 17:43

Не знаю, как gcc, а VC++ создает stack frame с запасом 64 байта, даже при отсутствии локальных переменных.
Ответить