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.
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
@ user2579277: Siamo spiacenti, non ho potuto rispondere prima, ora ho aggiunto un esempio più diretto. – cmaster
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