2013-02-19 17 views
7

Mam do czynienia z problemem wycieku pamięci w kodzie, podczas gdy jego działanie, stertą wzrasta do maksimum i muszę ponownie uruchomić usługę, uruchomiłem najwyższe polecenie i widzę, że stertę zwiększa się, ilekroć wywołuję scenariusz w usługa.valgrind Skok warunkowy lub ruch zależy od niezainicjowanych wartości, czy to wskazuje na przeciek pamięci?

wpadłem usługi valgrind,

valgrind --log-file=log-feb19.txt --leak-check=full --show-reachable=yes --track-origins=yes myservice 

I dawca widać żadnych zdecydowanie utracone lub ewentualnie utraconych bloków podczas iam działa scenariusze ale widzę dużo skok warunkowy lub Przenieś zależy od wartości zainicjalizowana (s) błędy.

Czy liczą się wycieki pamięci?

Przykład co otrzymuję:

==27278== Conditional jump or move depends on uninitialised value(s) 

==27278== at 0xC90D91E: xcsFreeMemFn (in /apps/opt/mqm/lib64/libmqmcs_r.so) 

........

==27278== Uninitialised value was created by a heap allocation 

==27278== at 0x4A078B8: malloc (vg_replace_malloc.c:270) 

==27278== by 0xC90E32F: xcsGetMemFn (in /apps/opt/mqm/lib64/libmqmcs_r.so) 

Czy ktoś pomaga.

+0

czy znalazłeś poprawną odpowiedź? jeśli tak, zaznacz to jako poprawne, proszę. – logoff

+0

możliwy duplikat [wskazujący "skok warunkowy lub ruch zależy od niezainicjowanych wartości" komunikat valgrind] (http://stackoverflow.com/questions/2612447/pinpointing-conditional-jump-or-move-depends-on-uninitialized -values-valgrin) –

Odpowiedz

15

Nie oznacza to, że masz dostęp do pamięci, który nie został zainicjowany:

int main() 
{ 
    int unitialized; 
    std::cout << unitialized << std::endl; 
} 

będzie powodować ten błąd.

Nieco bardziej powszechne byłoby:

struct X 
{ 
    X() : i(42) { } 
    private: 
    int i; 
    int* forgotten; // oops, not initialized 
}; 

Wreszcie, to często się dzieje z kodem opartym malloc, gdy użytkownik nie korzysta memset aby wyczyścić cały bufor. Tak więc,

  1. malloc rozmiar M buforu
  2. odczytu (na przykład z gniazda), n bajtów
  3. m bajtów do zapisu pliku; (m-n) bajty nie zostałyby zainicjowane
+0

Zgadzam się, że to nie wskazuje na przeciek pamięci, ale ponieważ wywołuje niezdefiniowane zachowanie, może prowadzić do wszystkiego, co jest –

1

Nie oznacza to bezpośrednio wycieku pamięci. Jednak skoki warunkowe w zależności od niezainicjowanej zmiennej mogą prowadzić do praktycznie wszystkiego. Używanie ogólnie niezainicjowanych zmiennych wywołuje niezdefiniowane zachowanie.

+2

W C, użycie niezainicjowanego obiektu nie jest niezdefiniowanym zachowaniem jako takim. Jest tylko UB, jeśli obiekt "mógł zostać zadeklarowany za pomocą" register ", to znaczy, jeśli jego adres nigdy nie zostanie zajęty. Odczyt niezainicjowanej pamięci za pomocą wskaźnika jest całkowicie w porządku (z tego POV). Jest to rozgałęzianie się na takich wartościach, które valgrind słusznie narzeka. –

4

Jest to wyjaśnione w Valgrind instrukcji obsługi, w rozdziale 4.2.2. Use of uninitialised values:

wykorzystanie błędu zainicjalizowana wartość jest zgłaszane, gdy Twój program wykorzystuje wartość który nie został zainicjowany - innymi słowy, jest niezdefiniowany.

...

Ważne jest, aby zrozumieć, że program może skopiować wokół śmieci (zainicjalizowana) danych jak to lubi. Memcheck obserwuje to i śledzi dane, ale nie narzeka. Skarga jest skierowana pod numerem tylko wtedy, gdy program próbuje wykorzystać niezainicjowane dane w postaci w sposób, który może wpłynąć na zachowanie użytkownika z zewnątrz.