2013-07-13 10 views
7

Dalla lettura del rapporto di perdita di memoria valgrind di "possibilmente perso", ho capito che c'è una minima possibilità che questo tipo di rapporto sia un rapporto falso positivo. Quello che non riuscivo a capire come ciò possa accadere in circostanze normali senza fare qualcosa di molto forzato al codice.Esiste un semplice esempio di rapporto "possibilmente perso" di valgrind falso positivo?

Quindi per la comprensione di questa opzione, sto chiedendo c'è un semplice esempio di valore di perdita di memoria valgrind falso-positivo "possibilmente perso"?

risposta

1

Ecco un esempio di un falso positivo di "eventualmente perduto":

class A { 
    int x; 
}; 
class B { 
    int y; 
}; 
class C : public A, B { 
    int z; 
}; 

int main() { 
    static B* notLost = new C(); //The upcast will change the pointer to point 4 bytes into the object, because that is the offset of the B subobject within the C object. 
    //Valgrind thinks, the new object may be possibly unreachable. 
    //But I can still do this: 
// delete (C*)notLost; //The downcast undoes the pointer modification by the upcast. 
} 

Ecco un esempio più generico di un falso positivo:

//get asprintf 
#define _GNU_SOURCE 
#include <stdio.h> 
#include <assert.h> 

char* getFoo() { 
    static char* foo = NULL; 
    if(!foo && asprintf(&foo, "Hello World\n") < 0) assert(0); 
    return foo; 
} 

int main() { 
    printf("%s", getFoo()); 
} 

Questo è un tipico ideom singleton: C'è una funzione da qualche parte, che fornisce l'accesso a un oggetto speciale (qui la stringa "Hello World"), assicurando che sia stato creato un solo oggetto. Poiché l'oggetto non viene mai distrutto/deallocato, Valgrind deve pensare che si tratti di una perdita di memoria. Di solito questi sono elencati come "ancora raggiungibili", poiché c'è ancora la variabile statica attraverso la quale è possibile accedervi, ma è comunque un falso positivo.

+0

C'è anche un buon esempio per il caso del rapporto "possibilmente perso", perché non ho capito come potrebbe esserci un rapporto falso positivo in quel caso? – user2579277

+0

@ user2579277: Siamo spiacenti, non ho potuto rispondere prima, ora ho aggiunto un esempio più diretto. – cmaster

+0

Mi dispiace ma il tuo nuovo esempio di possibile perdita non viene mostrato come problema in un rapporto di valgrind. E per il secondo esempio, asprint alloca la memoria nel suo nucleo in modo che il rapporto valgrind non sia falso positivo. – user2579277

Problemi correlati