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 -s10240PCで印刷します。
ご覧のとおり、どちらの場合もスタックサイズはそれよりも大きくなりulimit -sます。そして、スタックはより大きなローカル変数で成長します。スタックの一番上は3〜5kB離れています&a[0](赤いゾーンは128Bです)。
それでは、このスタックマップはどのように割り当てられますか?