No, il codice non deve (necessariamente) fornire un segfault. Un segfault si verifica quando si tenta di accedere a una pagina di memoria virtuale che non è allocata al processo.
"heap" o "negozio gratuito" è un'area di pagine di memoria virtuale di proprietà del processo. L'API malloc()
suddivide questa regione in blocchi e restituisce un puntatore al blocco.
Se si indirizza oltre la fine del blocco a cui si ha un puntatore, di solito si accede alla memoria che fa parte dell'heap, ma non parte del blocco assegnato. In questo modo, è possibile corrompere altri blocchi heap o anche le strutture dati utilizzate da malloc()
per definire l'heap.
Per ulteriori informazioni sulla corruzione heap, e metodi per rilevare nella versione di debug del codice, questo è un grande libro:
Writing Solid Code: Microsoft's Techniques for Developing Bug-Free C Programs by Steve Maguire alt text http://ecx.images-amazon.com/images/I/5148TK6JCVL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA240_SH20_OU01_.jpg
un addendum per il saccente: In rari casi , accedendo alla memoria oltre la fine di un blocco heap, è possibile accedere alla memoria che non fa parte dell'heap. In questi casi, potresti ricevere il difetto di segmentazione che ti aspettavi. Potresti anche corrompere qualche altra struttura di dati rispetto all'heap. È davvero una questione di fortuna. Tuttavia, l'heap stesso è molto grande rispetto ai blocchi heap tipici, quindi il 99% del time code come l'esempio danneggia l'heap. L'esempio che fornisci rientra nel caso del 99%.
fonte
2009-11-17 19:55:55
Probabilmente sono stato fortunato. –
Hai scritto un 5 in un posto che non ti apparteneva. Se il proprietario di quel posto non ha gradito quello che hai fatto a casa sua, otterrà la sua vendetta. ** Attenzione **, potrebbe appartenere al driver del disco USB e formatterà la prossima unità inserita. – pmg
@pmg: Realisticamente, non è molto probabile in un moderno sistema operativo in modalità protetta. – bcat