OSは、スタックまたは他の何かのために有効な仮想スペースの固定量を予約しますか?大きなローカル変数を使用するだけでスタックオーバーフローを生成できますか?
C
仮定をテストするための小さなプログラムを作成しました。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;
}
プログラムを実行する&a[0] = f0ceabe0
と&a[n-1] = f16eabdf
procマップはスタックを示します: 7ffff0cea000-7ffff16ec000. (10248 * 1024B)
それから私は増加しようとしました n = 11240 * 1024
プログラムを実行する&a[0] = b6b36690
と&a[n-1] = b763068f
procマップはスタックを示します: 7fffb6b35000-7fffb7633000. (11256 * 1024B)
ulimit -s
10240
PCで印刷します。
ご覧のとおり、どちらの場合もスタックサイズはそれよりも大きくなりulimit -s
ます。そして、スタックはより大きなローカル変数で成長します。スタックの一番上は3〜5kB離れています&a[0]
(赤いゾーンは128Bです)。
それでは、このスタックマップはどのように割り当てられますか?