Apakah OS menyimpan jumlah ruang virtual yang valid untuk stack atau sesuatu yang lain? Apakah saya dapat menghasilkan stack overflow hanya dengan menggunakan variabel lokal besar?
Saya telah menulis sebuah Cprogram kecil untuk menguji asumsi saya. Ini berjalan pada 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;
}
Menjalankan program memberi &a[0] = f0ceabe0dan&a[n-1] = f16eabdf
Peta proc menunjukkan tumpukan: 7ffff0cea000-7ffff16ec000. (10248 * 1024B)
Kemudian saya mencoba meningkatkan n = 11240 * 1024
Menjalankan program memberi &a[0] = b6b36690dan&a[n-1] = b763068f
Peta proc menunjukkan tumpukan: 7fffb6b35000-7fffb7633000. (11256 * 1024B)
ulimit -stercetak 10240di PC saya.
Seperti yang Anda lihat, dalam kedua kasus ukuran tumpukan lebih besar dari yang ulimit -sdiberikan. Dan tumpukan tumbuh dengan variabel lokal yang lebih besar. Bagian atas tumpukan entah bagaimana lebih dari 3-5kB &a[0](AFAIK zona merah adalah 128B).
Jadi bagaimana peta tumpukan ini dialokasikan?