¿El sistema operativo reserva la cantidad fija de espacio virtual válido para la pila o algo más? ¿Puedo producir un desbordamiento de pila simplemente usando grandes variables locales?
He escrito un pequeño C
programa para probar mi suposición. Se ejecuta en 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;
}
Ejecutar el programa da &a[0] = f0ceabe0
y&a[n-1] = f16eabdf
Los mapas de proceso muestran la pila: 7ffff0cea000-7ffff16ec000. (10248 * 1024B)
Entonces traté de aumentar n = 11240 * 1024
Ejecutar el programa da &a[0] = b6b36690
y&a[n-1] = b763068f
Los mapas de proceso muestran la pila: 7fffb6b35000-7fffb7633000. (11256 * 1024B)
ulimit -s
imprime 10240
en mi PC.
Como puede ver, en ambos casos el tamaño de la pila es mayor de lo que ulimit -s
da. Y la pila crece con una variable local más grande. La parte superior de la pila está de alguna manera 3-5kB más apagada &a[0]
(AFAIK la zona roja es 128B).
Entonces, ¿cómo se asigna este mapa de pila?