Newsgroup: it.comp.lang.c
Titolo: Heap corrotto

Salve a tutti
Sto cercando di migliorare un programma che ho trovato in rete
aggiungendogli un'interfaccia un pochino migliore. Mi sono cosi'
scritto un programma in C (con il Turbo C 3.0) che richiama una
funzione del programma trovato in rete. Questa funzione elabora tutto
quanto e mi restituisce il risultato.
Il problema che ho e' che di tanto in tanto il programma finisce in
crash senza un motivo valido. Dopo aver fatto molte prove ho visto che
un primo problema era dovuto al fatto che il programma trovato in rete
usava tante malloc ma nemmeno una free e cosi' la memoria finiva in
poco tempo. Adesso, che sono riuscito a mettere a posto tutte le free
e la farcoreleft mi dice che la quantita' di memoria libera e'
esattamente la stessa sia prima che dopo aver chiamato la funzione
incriminata, ho questo problema del crash che, a quanto pare, e'
causato dal fatto che l'heap e' corrotto (la farheapcheck() dice "Bad
value in free space) e rimane corrotto anche se tolgo tutte le free.
Domande :
- come fare a trovare dov'e' che l'heap viene corrotto ? (premetto che
il programma trovato in rete oltre ad applicare un algoritmo molto
complicato e' scritto anche in un C molto pesante, almeno per me)
- esiste qualche utility per monitorizzare l'heap ?
- come mettere a posto un heap corrotto ? Mi sembra di aver capito che
l'errore sparisce se chiamo la heapfillfree(). E' questa la funzione
che mette a posto tutto ?
Grazie in anticipo per le vs risposte

 l'errore sparisce se chiamo la heapfillfree(). 
ma non ti posso dare risposte a proposito se non "consulta la
manualistica del tuo compilatore"), l'unica soluzione e` implementare
una tua forma di allocazione dinamica della memoria, con GC. Questo,
ovviamente, implica una corposa revisione del codice prelevato da rete. 
	Alla prossima,
		Marco

 - come mettere a posto un heap corrotto ? Mi sembra di aver capito che
Posso suggerirti un'idea? Potresti monitorare tu stesso lo heap in un modo
semplice:
- sostituisci tutte le malloc del sorgente incriminato con una tua funzione
che chiama la malloc ma "tiene traccia" della memoria allocata (array di
puntatatori, lista, vedi tu come implementarla)
- ri-eliminare tutte le free
- dopo aver chiamato la funzione incriminata, chiami la free per ogni
memoria allocata tramite la tua funzione
In pratica, "intercetti" la chiamata alla malloc, e ti costruisci un tuo
gestore di heap.
Se vuoi puoi anche monitorare la memoria, prevedendo che ad ogni malloc, per
esempio, stampi a video la memoria richiesta e quella disponibile.
In teoria potresti anche intercettare l'interrupt DOS che alloca memoria, ma
mi sembra una strada più difficile, e inutile dal momento che hai il
sorgente.
Ciao
--
Alessandro Monti

you wrote :
#In teoria potresti anche intercettare l'interrupt DOS che alloca memoria, ma
#mi sembra una strada più difficile, e inutile dal momento che hai il
#sorgente.
E' preferibile la prima strada.
Quest'ultima soluzione, oltre ad essere poco utile per eventuali altri
programmatori e quindi poco portabile, e' piu' scomoda.
--------------------------------------------------------
* Andrea Laforgia        (
andrea_...@bigfoot.com
) *
--------------------------------------------------------

sorgente.
Provata anche questa strada. Ho trovato in rete una libreria da
linkare al mio programma che fornisce delle informazioni sull'uso
delle malloc e parenti e non trova nessun problema.
Dato che, del programma originale trovato in rete, ho anche
l'eseguibile compilato dall'autore sto pensando di seguire un'altra
strada (meno bella ma piu' sicura) : richiamare l'eseguibile
passandogli i valori usando la redirezione del DOS ( < ). A proposito,
ho notato che l'autore ha compilato il programma in console mode di
Win (mentre io credevo che fosse per DOS). Il fatto che io l'ho
compilato con un compilatore DOS puo' aver introdotto il problema ?

 compilato con un compilatore DOS puo' aver introdotto il problema ?
Non so, non conosco la console Win, mi sembra assurdo usare le funzioni
dedicate ad essa. Se voglio un output a caratteri non bastano le funzioni
standard?
Comunque credo che le malloc siano uguali in entrambi i sistemi. L'unico
dubbio è che, confidando nella gestione della memoria di windows, cerchi di
allocare più memoria di quella disponibile sotto DOS. Contolla che le malloc
facciano il loro dovere. Se hai implementato una funzione che raggruppa
tutte le malloc, diventa facile, dovendo modificare una sola funzione.
Se anche questo non funziona, il problema dev'essere altrove. Magari in
qualche chiamata al sistema scorretta.
--
Alessandro Monti