Ho citato "buffer overflow" in un commento alla risposta di Pythagras, probabilmente dovrei chiarire cosa volevo dire un po '. In C, non è sufficiente sapere che lavorare direttamente con la memoria è pericoloso - dovresti anche capire i modi precisi in cui è pericoloso. Non mi piace molto la metafora di "spararti al piede" per tutti questi casi - il più delle volte, non sei tu a premere il grilletto, ma spesso è un attore con interessi contrari al tuo e / o ai tuoi utenti .
Ad esempio, in un'architettura con uno stack discendente (le architetture più popolari si adattano a questo conto - x86 e ARM generalmente inclusi), quando si chiama una funzione, l'indirizzo di ritorno per la funzione verrà inserito nello stack dopo le variabili locali definite nella corpo della funzione. Quindi se dichiarate un buffer come variabile locale ed esponete quella variabile al mondo esterno senza controllare l'overflow del buffer, in questo modo:
void myFn(void) {
char buf[256];
gets(buf);
}
un utente esterno può inviarti una stringa che sovrascrive l'indirizzo di ritorno dallo stack - in pratica, può cambiare l'idea di runtime del programma del grafico di chiamata che porta alla funzione corrente. Quindi l'utente ti dà una stringa che è la rappresentazione binaria di un codice eseguibile per la tua architettura, una quantità sufficiente di riempimento da cui traboccare lo stack myFn
e alcuni dati aggiuntivi per sovrascrivere l'indirizzo di ritorno per myFn
puntare al codice che ti ha dato. Se ciò accade, allora quando . Dovresti capire perché un overflow del buffer rispetto allo stack è spesso (ma non sempre) più facilmente sfruttabile rispetto a uno contro l'heap, e dovresti capire come è disposta la memoria nell'heap (non in modo troppo dettagliato, necessariamente, ma il idea che amyFn
normalmente avrebbe restituito il controllo al chiamante, si diramerà invece al codice fornito dall'utente malintenzionato. Se si scrive codice C (o C ++) che potrebbe essere esposto a utenti non attendibili, è necessario comprendere questo vettore di attaccomalloc()
La regione ha strutture di controllo che la circondano possono aiutare a capire perché il tuo programma si blocca in un altro malloc()
o dentrofree()
).
C ti espone a dettagli di basso livello su come funziona la tua macchina e ti dà un controllo più diretto sulla tua macchina rispetto a qualsiasi altra lingua modificata dall'utente in uso diffuso oggi. Con una grande potenza derivano grandi responsabilità: in realtà è necessario comprendere quei dettagli di basso livello per lavorare con C in modo sicuro ed efficace.