Così, lo faccio:Dimensione massima dello stack, ulimit -s, segfault 11 - come funziona?
$ ulimit -s
8192
Grande. A quanto mi risulta, il segmento di stack di qualsiasi processo non può superare 8192 kilobyte.
Ora, per contestare tale ..
#include <stdio.h>
void over_8k(void) {
char buf[1024*1024*20];
}
int main(int argc, char** argv) {
printf("Starting .. ");
over_8k();
printf(" finishing.\nHow did this work?\n");
return 0;
}
compilato. Corse. Nessun problema. Beh, questo non è giusto? over_8k
da solo dovrebbe avere uno stack frame di, beh, oltre 20 megabyte. Bene, proviamo l'accesso a quei 20 milioni di byte:
#include <stdio.h>
#include <string.h>
void over_8k(void) {
char buf[1024*1024*20];
memset(buf, 'A', sizeof(buf));
}
int main(int argc, char** argv) {
printf("Starting .. ");
over_8k();
printf(" finishing.\nHow did this work?\n");
return 0;
}
.. rullo di tamburi ..
Segmentation fault: 11
Grande. Ma non è questo l'errore che mi aspetterei? Accesso alla memoria non valido?
Perché genera un segfault e non esegue l'errore prima? Su chiamata al over_8k
forse? Come funziona? Voglio sapere tutto.
La mia ipotesi: l'allocazione dello stack è spesso solo un incremento/decremento del puntatore dello stack. Quello stesso non segfault. È solo quando si tenta di accedere ai dati che entra nella memoria non mappata e si blocca. – Mysticial
@Mysticial: dannatamente giusto. È facile vedere quando il compilatore fornisce il codice assembly. – maverik
Che compilatore e bandiere stai usando per compilare e testare il codice sopra? – Matt