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

Valgrind a uninitialised value - traktować jako błąd?
KA
KA
  • Rejestracja:prawie 12 lat
  • Ostatnio:prawie 5 lat
  • 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?

PROGRAMY NA ZAMÓWIENIE, ZALICZENIA STUDENCKIE, KONFIGURACJA SERWERÓW, SYSTEMÓW I BAZ DANYCH, STRONY INTERNETOWE, POMOC W PROGRAMOWANIU, POPRAWIENIE I OPTYMALIZACJA APLIKACJI
JAVA, C++, LINUX, WWW, SQL, PYTHON
POSIADAM KOMERCYJNE DOŚWIADCZENIE
TANIO, SZYBKO I PORZĄDNIE
Z KOMENTARZAMI OBJAŚNIAJĄCYMI KOD
PISZ NA PRYWATNĄ WIADOMOŚĆ
CENY JUŻ OD 49,99ZŁ ZA PROGRAM
ZAJMIJ SIĘ TYM CO CIĘ NAPRAWDĘ INTERESUJE!
n0name_l
  • Rejestracja:ponad 12 lat
  • Ostatnio:prawie 5 lat
  • Postów:2412
1

Co robisz dalej z ta wartoscia?

MarekR22
Moderator C/C++
  • Rejestracja:ponad 17 lat
  • Ostatnio:4 minuty
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).


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 3x, ostatnio: MarekR22
KA
KA
  • Rejestracja:prawie 12 lat
  • Ostatnio:prawie 5 lat
  • 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


PROGRAMY NA ZAMÓWIENIE, ZALICZENIA STUDENCKIE, KONFIGURACJA SERWERÓW, SYSTEMÓW I BAZ DANYCH, STRONY INTERNETOWE, POMOC W PROGRAMOWANIU, POPRAWIENIE I OPTYMALIZACJA APLIKACJI
JAVA, C++, LINUX, WWW, SQL, PYTHON
POSIADAM KOMERCYJNE DOŚWIADCZENIE
TANIO, SZYBKO I PORZĄDNIE
Z KOMENTARZAMI OBJAŚNIAJĄCYMI KOD
PISZ NA PRYWATNĄ WIADOMOŚĆ
CENY JUŻ OD 49,99ZŁ ZA PROGRAM
ZAJMIJ SIĘ TYM CO CIĘ NAPRAWDĘ INTERESUJE!
KA
heh ciekawe czy te nagradzanie swojej odpowiedzi zielonym znaczkiem to feature czy bug ;]
MarekR22
feature, bo często się zdarza, że się znajduje odpowiedź na własne pytanie

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.