Valgrind a uninitialised value - traktować jako błąd?

Valgrind a uninitialised value - traktować jako błąd?
KA
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Warszawa
  • Postów: 1683
0

Hej. Mam w programie dynamiczną tablicę unsigned *indexes, która jest alokowana na wyrost i najczęściej przechowuje nof_elems elementow (od indeksu zero po nof_elems - 1). reszta mnie nie obchodzi i jest niezainicjowana w tej tablicy a gdy iteruje to zawsze pamiętam for(i=0;i<nof_elems;++i);. Zawsze sprawdzam aplikacje Valgrindem:
Conditional jump or move depends on uninitialised value(s) (...) Conditional jump or move depends on uninitialised value(s)
zajęło mi 50 minut żeby znaleźć błąd i zmienić

Kopiuj
data->indexes = malloc(alloc_nelems * sizeof(unsigned));

na data->indexes = calloc(alloc_nelems,sizeof(unsigned));

Kopiuj
dlaczego on traktuje to jako błąd i czy pozostawienie uninitialised values w tablicy jest niezalecane?
n0name_l
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2412
1

Co robisz dalej z ta wartoscia?

MarekR22
  • Rejestracja: dni
  • Ostatnio: dni
1

malloc różni się od calloc tym, że zeruję przydzielaną pamięć (malloc zawiera losowe dane).
To, że valgrind zgłaszał problem wynika z tego, że robiłaś jakąś operację odczytu na danych wskazanych przez data->indexes przed nadaniem im wartości.
Zmiana na calloc wiec uciszyła ostrzeżenie, ale niekoniecznie naprawiła błąd w kodzie (to już zależy od tego co dalej robisz).

KA
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Warszawa
  • Postów: 1683
0

Dobra wyjaśniło się. Rzeczywiście Valgrind prawdę Ci powie a calloc tylko go uciszył. Okazało się, że innej funkcji operującej na tej tablicy miałam błąd typu:

Kopiuj
data->indexes[i] = db->ids[last_id];

gdzie last_id było równe nof_elems zamiast nof_elems - 1; :P

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.