Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    214

    [C] Memory leak non rilevati.

    Ciao a tutti, ho scritto un semplicissimo programmino per capire meglio il funzionamento delle funzioni in mcheck.h, io voglio rilevare un memory leak, e ho scritto questo:

    codice:
    int foo(){
    char *string; 
    string = (char*)malloc(2048); 
    if(string == -1) return -1; 
    
    return 0; 
    }
    
    void main(){
    mtrace();
     
      while(1) 
            foo(); 
    
    muntrace(); 
    }
    Come si può vedere, la funzione foo alloca la memoria per la stringa senza mai rilasciarla, questo dovrebbe creare un memory leak, ma non viene mai rilevato. Infatti, eseguendo: mtrace ./eseguibile ottengo "No memory leaks.". Ora mi chiedo..perchè? E' evidente che ci dovrebbe essere.....

  2. #2
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    707
    Faccio solo un appunto, non conosco malloc che ritornino -1

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    707
    Sbagli a usare mtrace:
    $ mtrace eseguibile mtracedata

    Vedi qui che c'è un esempio completo (non c'è bisogno di quel while(1), basta 1 sola malloc senza free)
    http://en.wikipedia.org/wiki/Mtrace

    Ciao

  4. #4
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    214
    Ora riprovo come da te suggerito, però anche con valgrind, in quel codice che ti ho scritto, non rileva memory leaks... Inoltre volevo chiedervi, è possibile che una free() dia segfault su una macchina, mentre su un'altra no? Nello specifico, sulla mia macchina alloco una stringa, la uso e faccio la free. Tutto regolare. Oggi ho portato il codice su un pc dell'università: segfault quando esegue la free O.O Però valgrind, anche togliendo quella free, non da memory leaks, come è possibile? Ora riprovo anche con mtrace per verificare...

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    613
    Originariamente inviato da Smoke666
    Ora riprovo come da te suggerito, però anche con valgrind, in quel codice che ti ho scritto, non rileva memory leaks... Inoltre volevo chiedervi, è possibile che una free() dia segfault su una macchina, mentre su un'altra no? Nello specifico, sulla mia macchina alloco una stringa, la uso e faccio la free. Tutto regolare. Oggi ho portato il codice su un pc dell'università: segfault quando esegue la free O.O Però valgrind, anche togliendo quella free, non da memory leaks, come è possibile? Ora riprovo anche con mtrace per verificare...
    Bisogna vedere esattamente il codice con la free, se ricadi in qualche caso non definito dallo standard è possibile che tu ottenga risultati diversi su macchine diverse.

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    707
    Mi sono permesso di sostituire il while(1) con:
    foo();
    foo();
    foo();
    giusto per non crearmi un DoS da solo.

    Ottengo:
    codice:
    $ mtrace leak data.txt
    
    Memory not freed:
    -----------------
       Address     Size     Caller
    0x08a95378    0x800  at /home/demo/leak.c:6
    0x08a95b80    0x800  at /home/demo/leak.c:6
    0x08a96388    0x800  at /home/demo/leak.c:6
    La riga 6 è questa:
    string = (char*)malloc(2048);

    Idem con valgrind:
    codice:
    $ valgrind --leak-check=yes ./leak
    ==8621== Memcheck, a memory error detector
    ==8621== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al.
    ==8621== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info
    ==8621== Command: ./leak
    ==8621== 
    ==8621== 
    ==8621== HEAP SUMMARY:
    ==8621==     in use at exit: 6,656 bytes in 4 blocks
    ==8621==   total heap usage: 5 allocs, 1 frees, 7,008 bytes allocated
    ==8621== 
    ==8621== 2,048 bytes in 1 blocks are definitely lost in loss record 2 of 4
    ==8621==    at 0x402BE68: malloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
    ==8621==    by 0x8048455: foo (leak.c:6)
    ==8621==    by 0x804847C: main (leak.c:15)
    ==8621== 
    ==8621== 2,048 bytes in 1 blocks are definitely lost in loss record 3 of 4
    ==8621==    at 0x402BE68: malloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
    ==8621==    by 0x8048455: foo (leak.c:6)
    ==8621==    by 0x8048481: main (leak.c:16)
    ==8621== 
    ==8621== 2,048 bytes in 1 blocks are definitely lost in loss record 4 of 4
    ==8621==    at 0x402BE68: malloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
    ==8621==    by 0x8048455: foo (leak.c:6)
    ==8621==    by 0x8048486: main (leak.c:17)
    <cut>

  7. #7
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    214
    Grazie per la correzione c0der, il codice l'ho preso da wikipedia (italiana) mi pare, appena riesco lo testo nuovamente, e magari posto il codice "incriminato" con la free che si comporta diversamente su macchine diverse.

  8. #8
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    707
    il codice l'ho preso da wikipedia
    Mi daresti il link alla pagina... c'è qualcosa che non mi torna.
    Io poi non ho fatto nessuna correzione. Ho solo verificato che mtrace e valgrind funzionassero.

  9. #9
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    214
    http://it.wikipedia.org/wiki/Memory_leak

    Anche il codice dove c'era il "malloc == -1" l'ho preso in rete, infatti non c'ho fatto molto caso...Cercherò di ritrovarlo.

  10. #10
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    707
    Grazie mille della pagina

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.