Czy system operacyjny rezerwuje stałą ilość ważnego miejsca wirtualnego na stos lub coś innego? Czy jestem w stanie wygenerować przepełnienie stosu tylko przy użyciu dużych zmiennych lokalnych?
Napisałem mały C
program, aby sprawdzić moje założenia. Działa na X86-64 CentOS 6.5.
#include <string.h>
#include <stdio.h>
int main()
{
int n = 10240 * 1024;
char a[n];
memset(a, 'x', n);
printf("%x\n%x\n", &a[0], &a[n-1]);
getchar();
return 0;
}
Uruchomienie programu daje &a[0] = f0ceabe0
i&a[n-1] = f16eabdf
Mapy proc pokazują stos: 7ffff0cea000-7ffff16ec000. (10248 * 1024B)
Potem próbowałem zwiększyć n = 11240 * 1024
Uruchomienie programu daje &a[0] = b6b36690
i&a[n-1] = b763068f
Mapy proc pokazują stos: 7fffb6b35000-7fffb7633000. (11256 * 1024B)
ulimit -s
drukuje 10240
na moim komputerze.
Jak widać, w obu przypadkach rozmiar stosu jest większy niż ulimit -s
daje. A stos rośnie wraz z większą zmienną lokalną. Na górze stosu jest jakieś 3-5kB więcej &a[0]
(AFAIK, czerwona strefa to 128B).
Jak więc alokuje się tę mapę stosów?