Newsgroup: it.comp.lang.c
Titolo: Comportamenti diversi tra versione debug e release

Mi sono trovato di fronte a comportamenti diversi di un'applicazione
nell'esecuzione di una versione compilata in modalità debug e una in
modalità release con il compilatore VC++ 6.0 della Microsoft.
Volevo capire come e perchè succedono questi comportamenti e se è una cosa
specifica del compilatore MS o è comune a tutti quanti.
C'era un baco nel mio programma del tipo:
struct pippo * p = (struct pippo *) malloc(n* sizeof(struct pippino));
dove la size di pippino è < della size di pippo e i membri di pippino sono
un sottoinsieme di quelli di pippo (stessi nomi quindi).
Finché il programma è stato eseguito in modalità debug non ho mai avuto modo
di accorgermi dell'errore. In modalità release invece ho ottenuto violazione
di accesso alla memoria ed è evidente il perché.
Ora mi chiedo:
- perché questo comportamento? forse in modalità debug viene riservato più
spazio per le variabili allocate dinamicamente e quindi la malloc non
restituisce effettivamente quanto richiesto ma una zona di memoria di
dimensione >= ?
- secondo voi i dati elaborati nelle esecuzioni in modalità debug possono
essere considerati integri?
- è un comportamento specifico del compilatore MS?
Grazie per le risposte
Bye
John

 - è un comportamento specifico del compilatore MS?
Non necessariamente.
Caso mai, oltre al debug, vedi se puoi attivare (non so se esiste
per VC) una funzione che controlla proprio gli sforamenti di questo
tipo. (Per esempio su Borland C++ Builder 5 Pro c'era) anche se 
chiaramente puo' rallentare molto l'esecuzione.
ciao,
g.
-- 
AIUTARE= Accrescere il numero degli ingrati
(Ambrose Bierce, Il Dizionario del Diavolo)


Di questo me ne sono ricordato in fretta: ero troppo abituato a Java, CSharp
e compagnia bella.... il ritorno al C č stato un po' una doccia fredda!
Quindi tu escludi che il compilatore possa allocare dimensioni di memoria
diverse a seconda del tipo di comiplazione? in effetti non avrebbe molto
senso perň se č come dici tu č veramente strano: quella malloc serviva per
allocare memoria per un nodo di una lista concatenata.... con venti o trenta
elementi... e di queste liste ne avevo alcune migliaia.... quindi se come
dici tu il tutto dipende dall'ordine di allocazione e il tutto funzia solo
perché vado a scrivere su altre variabili ho veramente avuto una botta di
Qlo (o sfiga) veramente eccezionale. E' un'allocazione di diversi MB di
memoria, quante variabili avrň sovrascritto??.... possibile che non siano
mai saltati fuori valori errati?....
I misteri dell'allocazione dinamica.....
Grazie
Bye
John

 diverse a seconda del tipo di comiplazione? 
no, non escludo nulla, anche perche VC non l'ho mai dovuto
usare.
Pero' puoi cercare di capire questa cosa stampando
gli indirizzi piu' o meno fisici di due record successivi
allocati con questo sistema.


 mai saltati fuori valori errati?....
E' possibile.
C:\>iao Angelo
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 for a debugging header and overwrite buffers (debug version only).
Ne avevo il sospetto!!!!!
Grazie
Bye
John

 mai saltati fuori valori errati?....
Beh potresti essere andato a finire nell'area di stack (se questo possa 
generare un errore...), o nella zona di codice.
Ma anche il solo tentativo di scrivere in una zona di memoria protetta 
fa venir fuori un errore in runtime (non č detto perň che quella 
scrittura venga portata a termine, anzi non avviene proprio!).
Quindi l'errore č solo un avviso di un tuo tentativo di eseguire 
un'operazione illegale, operazione comunque non portata a termine dal S.O.
E' normale che non siano mai saltati fuori valori errati.
-- 
Quando noi ignoranti eravamo di piů, tutto era piů bello (A. Celentano).
  ___   _   ___ _  _______   _______ ___
|   \ /_\ | _ \ |/ / _ ) \ / /_   _| __|
| |) / _ \|   / ' <| _ \\ V /  | | | _|
|___/_/ \_\_|_\_|\_\___/ |_|   |_| |___|

 E' normale che non siano mai saltati fuori valori errati.
Non ho capito il tuo ragionamento ma grazie lo stesso.
Sul fatto che il SO non abbia portato a termine l'operazione quando mi
appare l'exception ero abbastanza convinto anch'io, visto che il programma
si blocca.....
la mia domanda si riferiva a quando in modalità debug tutto veniva eseguito
senza nessuna eccezione... mi chiedevo quindi se era possibile che ogni
volta che si era andati al di fuori delle zone di memoria da me allocate
fossi finito su altre variabili e modificandone il contenuto era possibile
che non mi fossi mai accorto di risultati clamorosamente errati......
in realtà la risposta corretta è probabilmente che dato che il debugger
alloca più memoria del necessario (grazie Angelo per l'info) non sono mai (o
quasi mai) andato a scrivere al di fuori delle mie variabili e tutto ha
sempre funzionato
Bye
John

 - è un comportamento specifico del compilatore MS?
Non direi.