Le système d'exploitation réserve-t-il la quantité fixe d'espace virtuel valide pour la pile ou autre chose? Suis-je capable de produire un débordement de pile simplement en utilisant de grandes variables locales?
J'ai écrit un petit C
programme pour tester mon hypothèse. Il fonctionne sur 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;
}
L'exécution du programme donne &a[0] = f0ceabe0
et&a[n-1] = f16eabdf
Les cartes proc montrent la pile: 7ffff0cea000-7ffff16ec000. (10248 * 1024B)
J'ai ensuite essayé d'augmenter n = 11240 * 1024
L'exécution du programme donne &a[0] = b6b36690
et&a[n-1] = b763068f
Les cartes proc montrent la pile: 7fffb6b35000-7fffb7633000. (11256 * 1024B)
ulimit -s
imprime 10240
sur mon PC.
Comme vous pouvez le voir, dans les deux cas, la taille de la pile est plus grande que ce qui ulimit -s
donne. Et la pile grandit avec une plus grande variable locale. Le haut de la pile est en quelque sorte de 3 à 5 Ko de plus &a[0]
(AFAIK, la zone rouge est de 128B).
Alors, comment cette carte de pile est-elle allouée?