2013-07-13 6 views
7

Aus dem Lesen des Valgrind-Speicherleck-Berichts von "möglicherweise verloren" habe ich verstanden, dass es eine sehr geringe Chance gibt, dass diese Art von Bericht ein falsch-positiver Bericht sein wird. Was ich nicht verstehen konnte, wie dies unter normalen Umständen passieren kann, ohne etwas sehr erzwungenes zum Code zu machen.Gibt es ein einfaches Beispiel für falsch-positive Valgrind "möglicherweise verloren" Bericht?

Also für das Verständnis dieser Option, ich frage, gibt es ein einfaches Beispiel für falsch-positive valgrind "möglicherweise verloren" Speicherleck-Bericht? Hier

Antwort

1

ist ein Beispiel für eine falsch positiv von „möglicherweise verloren“:

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. 
} 

Hier ist ein allgemeines Beispiel für eine falsch positiv:

//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()); 
} 

Dies ist ein typisches Singleton Ideom: Es gibt irgendwo eine Funktion, die Zugriff auf ein spezielles Objekt (hier die "Hello World" -Zeichenfolge) gewährt, um sicherzustellen, dass nur ein solches Objekt jemals erstellt wird. Da das Objekt niemals zerstört/freigegeben wird, muss Valgrind denken, dass es ein Speicherleck ist. In der Regel werden diese als "noch erreichbar" aufgeführt, da es immer noch die statische Variable gibt, über die man darauf zugreifen kann, aber es ist trotzdem falsch positiv.

+0

Gibt es auch ein gutes Beispiel für den Fall des "möglicherweise verlorenen" Berichts, weil ich nicht verstanden habe, wie es in diesem Fall zu einem falsch positiven Bericht kommen könnte? – user2579277

+0

@ user2579277: Sorry, ich konnte nicht früher antworten, ich habe jetzt ein direkteres Beispiel hinzugefügt. – cmaster

+0

Es tut mir leid, aber Ihr neues Beispiel für möglicherweise verloren zeigt sich nicht als Problem in einem Valgrind-Bericht. Und für das zweite Beispiel, asprint Speicher in seinem Kern zuweisen, so dass der Valgrind-Bericht nicht falsch positiv ist. – user2579277

Verwandte Themen