Torna indietro   Hardware Upgrade Forum > Software > Programmazione

WoW Forever provato: il MMORPG che la community chiedeva da anni è arrivato
WoW Forever provato: il MMORPG che la community chiedeva da anni è arrivato
Abbiamo provato la beta di World of Warcraft: Forever, il Classic+ di Blizzard in arrivo il 4 novembre: la nuova razza Skyborne restituisce la sensazione di un gioco nuovo, ma le zone storiche conservano la noia divertita di Classic. Classi ribilanciate, sciamani anche nell'Alleanza e un motore grafico che in 4K gira bene anche su una RTX 3070. Cosa cambia in Forever? La risposta nell'articolo
TCL P80 Ultra: con un display AMOLED opaco è una gioia per gli occhi e per le dita
TCL P80 Ultra: con un display AMOLED opaco è una gioia per gli occhi e per le dita
TCL P80 Ultra abbina per la prima volta un pannello AMOLED alla tecnologia NXTPAPER con finitura opaca, affiancandoci una fotocamera periscopica da 50 MP con zoom ottico 3x, il SoC Dimensity 7400 Elite e una batteria da 5.800 mAh. Nella prova sul campo emergono luminosità di picco molto elevata, comparto fotografico solido per la fascia di prezzo e autonomia nella media, a fronte di velocità di scrittura dello storage piuttosto contenute
HUAWEI MatePad Air recensione: OLED opaco e tastiera dedicata per lavorare meglio
HUAWEI MatePad Air recensione: OLED opaco e tastiera dedicata per lavorare meglio
HUAWEI MatePad Air combina diverse carte molto interessanti: un OLED PaperMatte da 12 pollici, un corpo sottile e una tastiera molto comoda. Durante la prova abbiamo apprezzato fluidità, audio e comfort visivo, mentre i test hanno chiarito pregi e qualche limite nelle prestazioni. L'autonomia ha convinto anche nell'uso intermittente; la scelta passa dalla compatibilità delle proprie app e dal valore del pacchetto con accessori, proposto a 749 euro
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 15-09-2011, 09:20   #1
ndakota
Senior Member
 
L'Avatar di ndakota
 
Iscritto dal: Oct 2006
Città: milano
Messaggi: 1439
[C] Errori di memoria(uso valgrind)

Ciao a tutti, da ieri sto usando valgrind come supporto per lo sviluppo di questo progetto universitario che sto facendo. Ora, sono riuscito ad eliminare tutti i memory leaks, tant'è che l'output finale di valgrind è questo

Codice:
==5421== HEAP SUMMARY:
==5421==     in use at exit: 0 bytes in 0 blocks
==5421==   total heap usage: 422 allocs, 422 frees, 2,625 bytes allocated
==5421== 
==5421== All heap blocks were freed -- no leaks are possible
Però a parte questo, mi segnala un sacco di errori che non so risolvere. Il programma ora come ora se lanciato normalmente sbaglia un output proprio per gli errori di memoria anche se non dà errori. Mentre se lanciato con valgrind perfino l'output è giusto.
Qualcuno mi sa dire a cosa sono dovuti errori di questo tipo

Codice:
==5421== Conditional jump or move depends on uninitialised value(s)
==5421==    at 0x804A1C6: graph_print (graph.c:44)
==5421==    by 0x8048758: main (main.c:43)
==5421==
Codice:
==5421== Invalid read of size 4
==5421==    at 0x8049F14: list_publication_author (util.c:446)
==5421==    by 0x80487EA: main (main.c:55)
==5421==  Address 0x41a24c8 is 0 bytes inside a block of size 8 free'd
==5421==    at 0x4025BF0: free (vg_replace_malloc.c:366)
==5421==    by 0x804936C: destroy_list (list.c:51)
==5421==    by 0x8048796: main (main.c:47)
==5421== 
==5421== Invalid read of size 1
==5421==    at 0x407BD6E: vfprintf (vfprintf.c:1620)
==5421==    by 0x408389F: printf (printf.c:35)
==5421==    by 0x8049F26: list_publication_author (util.c:446)
==5421==    by 0x80487EA: main (main.c:55)
==5421==  Address 0x41a2500 is 0 bytes inside a block of size 4 free'd
==5421==    at 0x4025BF0: free (vg_replace_malloc.c:366)
==5421==    by 0x8049361: destroy_list (list.c:50)
==5421==    by 0x8048796: main (main.c:47)
==5421== 
==5421== Invalid read of size 1
==5421==    at 0x40A3128: _IO_file_xsputn@@GLIBC_2.1 (fileops.c:1317)
==5421==    by 0x407BC65: vfprintf (vfprintf.c:1620)
==5421==    by 0x408389F: printf (printf.c:35)
==5421==    by 0x8049F26: list_publication_author (util.c:446)
==5421==    by 0x80487EA: main (main.c:55)
==5421==  Address 0x41a2502 is 2 bytes inside a block of size 4 free'd
==5421==    at 0x4025BF0: free (vg_replace_malloc.c:366)
==5421==    by 0x8049361: destroy_list (list.c:50)
==5421==    by 0x8048796: main (main.c:47)
==5421== 
==5421== Invalid read of size 1
==5421==    at 0x40A313F: _IO_file_xsputn@@GLIBC_2.1 (fileops.c:1317)
==5421==    by 0x407BC65: vfprintf (vfprintf.c:1620)
==5421==    by 0x408389F: printf (printf.c:35)
==5421==    by 0x8049F26: list_publication_author (util.c:446)
==5421==    by 0x80487EA: main (main.c:55)
==5421==  Address 0x41a2501 is 1 bytes inside a block of size 4 free'd
==5421==    at 0x4025BF0: free (vg_replace_malloc.c:366)
==5421==    by 0x8049361: destroy_list (list.c:50)
==5421==    by 0x8048796: main (main.c:47)
==5421== 
==5421== Invalid read of size 1
==5421==    at 0x40A30B0: _IO_file_xsputn@@GLIBC_2.1 (fileops.c:1349)
==5421==    by 0x407BC65: vfprintf (vfprintf.c:1620)
==5421==    by 0x408389F: printf (printf.c:35)
==5421==    by 0x8049F26: list_publication_author (util.c:446)
==5421==    by 0x80487EA: main (main.c:55)
==5421==  Address 0x41a2500 is 0 bytes inside a block of size 4 free'd
==5421==    at 0x4025BF0: free (vg_replace_malloc.c:366)
==5421==    by 0x8049361: destroy_list (list.c:50)
==5421==    by 0x8048796: main (main.c:47)
==5421== 
==5421== Invalid read of size 1
==5421==    at 0x40A30BC: _IO_file_xsputn@@GLIBC_2.1 (fileops.c:1348)
==5421==    by 0x407BC65: vfprintf (vfprintf.c:1620)
==5421==    by 0x408389F: printf (printf.c:35)
==5421==    by 0x8049F26: list_publication_author (util.c:446)
==5421==    by 0x80487EA: main (main.c:55)
==5421==  Address 0x41a2502 is 2 bytes inside a block of size 4 free'd
==5421==    at 0x4025BF0: free (vg_replace_malloc.c:366)
==5421==    by 0x8049361: destroy_list (list.c:50)
==5421==    by 0x8048796: main (main.c:47)
==5421== 
==5421== Invalid read of size 4
==5421==    at 0x8049F2A: list_publication_author (util.c:448)
==5421==    by 0x80487EA: main (main.c:55)
==5421==  Address 0x41a24cc is 4 bytes inside a block of size 8 free'd
==5421==    at 0x4025BF0: free (vg_replace_malloc.c:366)
==5421==    by 0x804936C: destroy_list (list.c:51)
==5421==    by 0x8048796: main (main.c:47)
==5421== 
==5421== Invalid read of size 4
==5421==    at 0x8049F4F: list_publication_author (util.c:453)
==5421==    by 0x80487EA: main (main.c:55)
==5421==  Address 0x41a24cc is 4 bytes inside a block of size 8 free'd
==5421==    at 0x4025BF0: free (vg_replace_malloc.c:366)
==5421==    by 0x804936C: destroy_list (list.c:51)
==5421==    by 0x8048796: main (main.c:47)
==5421==
Grazie a tutti
ndakota è offline   Rispondi citando il messaggio o parte di esso
Old 15-09-2011, 10:35   #2
marco.r
Senior Member
 
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
Quote:
Conditional jump or move depends on uninitialised value(s)
sembra una variabile non inizializzata
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele
marco.r è offline   Rispondi citando il messaggio o parte di esso
Old 15-09-2011, 10:39   #3
ndakota
Senior Member
 
L'Avatar di ndakota
 
Iscritto dal: Oct 2006
Città: milano
Messaggi: 1439
Quote:
Originariamente inviato da marco.r Guarda i messaggi
sembra una variabile non inizializzata
Ho "risolto" ma la cosa non mi convince. Nel main ho questo pezzo

Codice:
case 'A':
            p = get_publication();
            headAuthors = p->authors;
            headBibliography = p->bibliography;            

            if(check_publication_id(pubTree, p->id) 
                  &&   check_publication_authors(researchers, p->authors) 
                  && check_publication_bibliography(pubTree, p->bibliography))
             {  
                 add_publication_id(publicationIdGraph, p->id, p->bibliography);
                 graph_print(publicationIdGraph);
                 add_publication(&pubTree, &researchers, p);
             } 
            /*
            destroy_list(headAuthors);
            destroy_list(headBibliography);*/
            free(p->id);
            free(p->title);
            free(p);
            break;
La situazione era questa. Prima di commentare le due righe commentate nel codice, valgrind mi segnalava una 70ina di errori però nessun memory leaks(tante malloc quante free). Commentate quelle due righe, gli errori da 70 sono scesi a 2 però mi perdo qualche free ovviamente. Ora non so che fare. Le ho lasciate commentate perchè così comunque funziona però non ho deallocato quelle due liste che fan parte della struttura.
ndakota è offline   Rispondi citando il messaggio o parte di esso
Old 15-09-2011, 11:41   #4
marco.r
Senior Member
 
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
E' impossibile aiutarti se non pubblichi almeno il pezzo incriminato (la definizione di graph_print)
edit: Scusa avevo perso il pezzo dove dicevi che hai risolto.
Che errori ti segnalava ? Il problema in questi casi e' tipicamente NON dove fai la free, ma quanto il fatto che ci arrivi con dei puntatori sballati.
(i.e. il bug e' prima).
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele
marco.r è offline   Rispondi citando il messaggio o parte di esso
Old 15-09-2011, 12:56   #5
WarDuck
Senior Member
 
L'Avatar di WarDuck
 
Iscritto dal: May 2001
Messaggi: 13053
Probabilmente è la funzione destroy_list a non essere completamente corretta.

Dovresti postare il codice o comunque controllare lì dentro .
WarDuck è offline   Rispondi citando il messaggio o parte di esso
Old 15-09-2011, 13:03   #6
ndakota
Senior Member
 
L'Avatar di ndakota
 
Iscritto dal: Oct 2006
Città: milano
Messaggi: 1439
La funzione è questa

Codice:
void destroy_list(List l)
{
   struct node * temp;  

   if(l == NULL)
      return;
  
    while(l != NULL)  
    {
       temp = l->next;         
       free(l->value);
       free(l);         
       l = temp;          
    }
}
Secondo me l'errore è nel case di prima. Io copio due puntatori ma se poi nella funzione modifico quello che ho assegnato a questi puntatori, quando viene chiamata la destroy_list non puntano più alla testa no?
Ho bisogno di un po' di chiarezza
ndakota è offline   Rispondi citando il messaggio o parte di esso
Old 16-09-2011, 18:23   #7
marco.r
Senior Member
 
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
Vediamo troppo poco codice per poter capire, soprattutto perche' non si capisce bene a quali righe di codice si riferiscano gli errori dell'inizio.

Comunque, se il problema e' che facendo la free deallochi correttamente (ma poi accedi a memoria deallocata) e se non la fai poi ti resta memoria allocata alla fine dell'esecuzione, direi che il problema e' il seguente:

Probabilmente utilizzi anche da qualche altra parte i valori contenuti nella lista headAuthors o headBibliography, assegnando i puntatori invece che duplicandone il contenuto.

In alternativa potrebbe essere dovuto anche al fatto che quando distruggi la lista distruggi non solo la lista in se, ma anche i valori puntati.
Immagino ad esempio che diverse pubblicazioni possano avere uno stesso autore. In quel caso, condividono la stessa struttura, o si tratta di due copie distinte ?
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele
marco.r è offline   Rispondi citando il messaggio o parte di esso
Old 16-09-2011, 18:38   #8
ndakota
Senior Member
 
L'Avatar di ndakota
 
Iscritto dal: Oct 2006
Città: milano
Messaggi: 1439
Quote:
Originariamente inviato da marco.r Guarda i messaggi
Vediamo troppo poco codice per poter capire, soprattutto perche' non si capisce bene a quali righe di codice si riferiscano gli errori dell'inizio.

Comunque, se il problema e' che facendo la free deallochi correttamente (ma poi accedi a memoria deallocata) e se non la fai poi ti resta memoria allocata alla fine dell'esecuzione, direi che il problema e' il seguente:

Probabilmente utilizzi anche da qualche altra parte i valori contenuti nella lista headAuthors o headBibliography, assegnando i puntatori invece che duplicandone il contenuto.
E' vero, solitamente assegno i puntatori. Come faccio a duplicarne il contenuto?


Quote:
Originariamente inviato da marco.r Guarda i messaggi
In alternativa potrebbe essere dovuto anche al fatto che quando distruggi la lista distruggi non solo la lista in se, ma anche i valori puntati.
Immagino ad esempio che diverse pubblicazioni possano avere uno stesso autore. In quel caso, condividono la stessa struttura, o si tratta di due copie distinte ?
No, no. Ogni pubblicazione ha la sua lista di autori. Che poi potrebbero essere gli stessi è un altro discorso. Comunque il progetto è diventato davvero grosso a livello di codice. Non ho nessun problema a mettere codice ma non so che parte mettere.
ndakota è offline   Rispondi citando il messaggio o parte di esso
Old 16-09-2011, 22:09   #9
marco.r
Senior Member
 
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
Quote:
Originariamente inviato da ndakota Guarda i messaggi
E' vero, solitamente assegno i puntatori. Come faccio a duplicarne il contenuto?
Assegni il contenuto invece che il puntatore

Invece di
Codice:
int* x;
int* y;
y = blabla();
x = y;
devi passare a qualcosa tipo

Codice:
int* x;
int* y;
y = blabla();
x = malloc(sizeof(int));
*x = *y;
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele
marco.r è offline   Rispondi citando il messaggio o parte di esso
Old 17-09-2011, 08:44   #10
ndakota
Senior Member
 
L'Avatar di ndakota
 
Iscritto dal: Oct 2006
Città: milano
Messaggi: 1439
Ok, il fatto è che ho strutture con campi struttura e stringa per esempio.
Come devo fare in questo caso? Basta che alloco la struttura e assegno solo la struttura o devo allocare ogni singolo campo e copiarli tutti? E poi se voglio deallocare l'intera struttura? Devo sempre prima deallocare un campo alla volta?
ndakota è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


WoW Forever provato: il MMORPG che la community chiedeva da anni è arrivato WoW Forever provato: il MMORPG che la community ...
TCL P80 Ultra: con un display AMOLED opaco è una gioia per gli occhi e per le dita TCL P80 Ultra: con un display AMOLED opaco &egra...
HUAWEI MatePad Air recensione: OLED opaco e tastiera dedicata per lavorare meglio HUAWEI MatePad Air recensione: OLED opaco e tast...
NVIDIA RTX Spark: il PC Windows on ARM costruito per l'IA agentica NVIDIA RTX Spark: il PC Windows on ARM costruito...
Motorola razr fold, dalla conchiglia al formato a libro. La recensione Motorola razr fold, dalla conchiglia al formato ...
Generative Bionics apre la più gr...
Mercury 3 di Inception: 1 milione di tok...
RAM per portatili e PC all-in-one in off...
PHP, due falle critiche: patch alle 16 e...
ISRO sta proseguendo lo sviluppo della n...
Greenpeace interrompe il keynote di Jens...
YouTube sperimenta una nuova interfaccia...
WhatsApp prepara una nuova barra di navi...
Apple è pronta ad assemblare Mac ...
ESA OASIS: il sistema che aiuterà...
ho. Mobile aggiorna il listino: solo off...
L'IA accelera i processi di modernizzazi...
Amazon apre un secondo laboratorio di ro...
GM chiuderà la fabbrica di batterie di B...
Un detrito di un razzo spaziale cinese L...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 15:08.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v