Czy program musi być wykrywany przez valgrind jako "czysty"?

0

Cześć!
Pracuje sobie hobbystycznie nad trochę bardziej zaawansowanym kalkulatorem, a raczej tworzę bibliotekę pod program do obliczeń, mniej istotne.
Miałem pewne problemy z pamięcią i zainteresowałem się valgrindem. Pomimo tego, że w tym momencie mój program już działa to valgrind wyrzuca masę błędów. Błędy typu "invalid read" przy kodzie typu:

int length=strlen(buff) 

gdzie buff jest wskaźnikiem na char, do którego została przydzielona pamięć za pomocą malloca.

Moje pytanie jest takie - czy tymi problemami mam się przejmować, tj są one krytyczne (i muszę zacząć szukać w dokumentacji C, a nie tylko w książkach jak te problemy rozwiązać), czy program jest niesamowicie czepliwy?

Z góry dzięki za odpowiedź, zdaję sobie sprawę, że mogłem wybrać nieodpowiedni dział, ale nie znalazłem nic bardziej odpowiedniego do tego problemu.

0

Bez większego kontekstu nie można nic powiedzieć.
Pokaż przykład krótkiego programu, który się kompiluje, uruchamia, a przy którym valgrind się czepia.

1

Valgrind to nie jest najlepsze narzędzie, ma swoje ograniczenia i zdarza mu się zgłaszać fałszywe alarmy.
W podanym przypadku, jednak sprawdziłbym kod czy przypadkiem nie przekraczasz tablicy (jest to raczej pewne, bo nie słyszałem by w tym wypadku valgrind zgłaszał fałszywe alarmy). Wygląda na to, że buff jest za mały albo napis, który tam pakujesz nie jest prawidłowo zakończony zerem.

1

@x153g a pewny jesteś że ten mallocowany obszar kończy się znakiem \0 ? Bo ja zgaduje że nie, a wtedy strlen zwraca ci głupoty, a ty następnie pewnie mażesz po nie swojej pamięci bo przekraczasz zaalokowany obszar.

0

Znaczy nie proszę tutaj o sprawdzenie kodu i wskazanie błędu, myślę, że na tyle poznałem język, że powinienem sam umieć napisać program. Piszę go tylko w celach treningowych, więc samodzielne rozwiązywanie problemów, z którymi jeszcze walczę (braki w doświadczeniu, a nie braki wiedzy - przynajmniej tak mi się wydaje) przyniesie mi największe korzyści.
Zdaje mi się, że wrzucałem '\0' na końcu każdego stringa, możliwe, że gdzieś są niedopatrzenia.

Pytanie moje miało na celu ustalenie, czy valgrind jest programem, którym muszę się przejmować. Rozumiem, że program bez bugów związanych z zarządzaniem pamięcią nie powinien powodować błędów w valgrindzie, a jeśli już to błędów powinno być mało?

Nawiasem mówiąc, pisanie czegoś w miarę większego (czyt. już użytecznego w jakiś sposób) w C powoduje, że zacząłem bardziej doceniać zalety C++ ;).

0

a czy rozumiesz że nikt tu szklanych kul nie ma? Mają Ci wywróżyć z fusów od herbaty czy może jednak dasz kod który powoduję błąd w valgrindzie?

2

@x153 możesz z dużą dozą prawdopodobieństwa założyć że błąd jest u ciebie a nie w valgrindzie. Może się zdarzyć że to jednak valgrind zaćpał, ale nie liczyłbym na to.
To trochę tak jak z początkującymi którzy uparcie twierdzą ze to IDE/kompilator/biblioteka ma jakiś błąd bo ich kod jest na 100% poprawny. Nie muszę chyba mówić że w 99,9% przypadków błąd jest jednak w kodzie? ;)

0

Jadę na GCC, więc na kompilator nawet nie będę próbował zwalać (jak coś kompiluje kernel linuksa to powinien sobie i z prostą biblioteką poradzić...). Tak się obawiałem, że jednak te błędy w valgrindzie to nie byle widzi-mi-się, ale wolałem się upewnić. Wielkie dzięki :)

0

To trochę tak jak z początkującymi którzy uparcie twierdzą ze to IDE/kompilator/biblioteka ma jakiś błąd bo ich kod jest na 100% poprawny. Nie muszę chyba mówić że w 99,9% przypadków błąd jest jednak w kodzie?

A jak piszą w Dev-C++?

0

Problem błędów Valgrinda się rozwiązał. Faktycznie moje niedopatrzenie, w jednym miejscu nie pomyślałem, że wskaźnik może zmieniać swoje położenie (tj w jednej funkcji), cóż - na błędach się uczymy ;].

Swoją drogą... Program jest kalkulatorem bardziej złożonych operacji matematycznych, który obsługuje liczby zespolone(bez używania biblioteki complex.h). Przyjmuje od użytkownika tablicę charów (np. (2i+17.3)*2<0.38=), przerabia na postać, gdzie zapisana jest tylko kolejność wykonywania działań i ładuje do tablicy complexów wczytane wartości (tj przerobiłby wcześniej wymienioną tablicę na (x0+x1)*x2=). Przy każdym wczytaniu, a następnie po wykonaniu każdego działania pamięć przydzielana jest dynamicznie (malloc i free). Pytanie tutaj - czy takie rozwiązanie ma sens?

Program pomyślałem w ten sposób, żeby również dało się go odpalić na mikrokontrolerze (tutaj przede wszystkim Atmega) - bo na tym sprzęcie takie operacje mogą być czasochłonne (patrząc na casio fx590...), mallocami i free chciałem bronić jego pamięci, żeby nie tworzyć niepotrzebnie zbyt dużych tablic. Jednak może trzeba przepisać kod w taki sposób, żeby pamięć przydzielała się raz, a późniejsze zmniejszenia rozmiarów (tj jak wyżej wymieniony string przyjmie wartości x0*x2=) jest szkodliwe (tj trwa zbyt długo)? Problemu trwania "za długo" nie jestem w stanie zaobserwować na PC z wiadomych przyczyn, ale kwestia wydajności na AVRach moze być krytyczna.

1 użytkowników online, w tym zalogowanych: 0, gości: 1