2013-07-13 12 views
7

Z czytania o raporcie wycieku pamięci valgrind "prawdopodobnie zaginionego", zrozumiałem, że istnieje bardzo mała szansa, że ​​ten rodzaj raportu będzie fałszywie pozytywnym raportem. Czego nie mogłem zrozumieć, jak to może się zdarzyć w normalnych okolicznościach, nie robiąc czegoś bardzo wymuszonego na kodzie.Czy istnieje prosty przykład "zgubionego" raportu fałszywie pozytywnego valgrin?

Tak więc dla zrozumienia tej opcji, pytam, czy istnieje prosty przykład fałszywie pozytywnego "zgubionego" raportu wycieku pamięci?

Odpowiedz

1

Oto przykład fałszywego pozytyw „ewentualnie utracone”:

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

Oto bardziej ogólny przykładem fałszywie dodatni:

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

Jest to typowy Singleton ideom: Istnieje gdzieś funkcja, która zapewnia dostęp do specjalnego obiektu (tutaj ciąg "Hello World"), zapewniając, że istnieje tylko jeden taki obiekt kiedykolwiek stworzony. Ponieważ obiekt nigdy nie jest niszczony/deallocated, Valgrind musi pomyśleć, że to przeciek pamięci. Zwykle są one wymienione jako "wciąż osiągalne", ponieważ wciąż istnieje zmienna statyczna, dzięki której można uzyskać do niej dostęp, ale mimo to jest ona fałszywie dodatnia.

+0

Czy istnieje również dobry przykład dla przypadku raportu "potencjalnie zagubionego", ponieważ nie rozumiałem, w jaki sposób może być w tym przypadku fałszywy pozytywny raport? – user2579277

+0

@ user2579277: Przepraszam, nie mogłem odpowiedzieć wcześniej, dodałem teraz bardziej bezpośredni przykład. – cmaster

+0

Przykro mi, ale twój nowy przykład dla potencjalnego zagubienia nie pokazuje problemu w raporcie Valgrind. A dla drugiego przykładu, asprint przydziela pamięć w jego rdzeniu, więc raport valgrind nie jest fałszywie pozytywny. – user2579277