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

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

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

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

Сообщение flux » 09 июн 2005, 16: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

Сообщение Eugie » 10 июн 2005, 00:28

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

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

Сообщение flux » 10 июн 2005, 09:43

Тогда просто я думаю этот размер должен быть статичным, проэксперементировав с размером буфера я просто так и не нашел на сколько он прибавляет стек... каждый раз разный размер и четкого алгоритма так я и не выявил...

Eugie
Сообщения: 707
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

Сообщение Eugie » 12 июн 2005, 16:43

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

Ответить