안녕하세요.
저는 Ubuntu 9.04에서 Valgrind를 사용하여 코드를 검사하였습니다. 그런데, 이틀 전 Ubuntu 9.10으로 업그레이드를 한 후 Valgrind를 사용하니, 이전에는 에러가 없었던 코드가 에러가 나더군요. 혹시 비슷한 경우를 겪은 분 계신가요? (참고로 저는 프로그래밍과 Ubuntu 모두 초보입니다.)
제 코드에 32비트용 코드를 포함하고 있어서, cc -m32 codename.c -lm 으로 컴파일 하였습니다.
구체적으로 에러는 아래와 같이 초기화를 시키지 않았다고 나옵니다.
==5939== Conditional jump or move depends on uninitialised value(s)
==5939== at 0x400A27E: _dl_relocate_object (do-rel.h:65)
==5939== by 0x400312E: dl_main (rtld.c:2287)
==5939== by 0x4013DFD: _dl_sysdep_start (dl-sysdep.c:243)
==5939== by 0x4000C6C: _dl_start (rtld.c:328)
==5939== by 0x4000856: ??? (in /lib/ld-2.10.1.so)
저는 valgrind를 잘 모르지만, 그 프로그램이 내 놓은 output을 보면, 그럴 만해서 내 놓은 것 같군요. initialize안 하고 variable을 if 문과 같은 곳에서 사용하면 알 수 없는 결과가 나올 테죠. 저런 건 valgrind 말고 컴파일러 같은 곳에서라도 컴파일 시에 warning을 줄 만한 내용인데요. 아마도 그 전에는 valgrind의 default option에는 저런 것을 안 잡도록 돼 있다가 9.10에 새 버젼의 프로그램이 들어가면서 default option에 변화가 생긴 건 아닐까요?
인터넷을 검색해 보니, valgrind 의 알려진 오류인 것 같습니다.
[url:1wsmjo8y]https://bugs.kde.org/show_bug.cgi?id=190429[/url:1wsmjo8y]
위의 링크에 이것에 대한 patch 파일을 첨부 했다고 합니다.
그런데, 파일을 보면 문서로 되어 있는데, 패치를 어떻게 하나요?
[quote="jaeoh":318zfkqj]인터넷을 검색해 보니, valgrind 의 알려진 오류인 것 같습니다.
[url:318zfkqj]https://bugs.kde.org/show_bug.cgi?id=190429[/url:318zfkqj]
위의 링크에 이것에 대한 patch 파일을 첨부 했다고 합니다.
그런데, 파일을 보면 문서로 되어 있는데, 패치를 어떻게 하나요?[/quote:318zfkqj]
이상한데요. 링크하신 곳에 있는 것은 x84_64에서의 strlen 함수에 대한 것인데, 첨부하신 valgrind 출력하고는 상관 없는 것 같은데요.
두분 답변 모두 감사합니다.
하지만, 제 컴퓨터의 Valgrind 의 버전은 이미 3.5.0 이였으며, update, upgrade를 시켜도 문제는 여전히 발생합니다.
아래의 코드를 실행시켜도 에러가 있다고 합니다.
include <stdio.h>
int main ()
{
printf("Hello world");
return 0;
}
==7753== Conditional jump or move depends on uninitialised value(s)
==7753== at 0x400A27E: _dl_relocate_object (do-rel.h:65)
==7753== by 0x400312E: dl_main (rtld.c:2287)
==7753== by 0x4013DFD: _dl_sysdep_start (dl-sysdep.c:243)
==7753== by 0x4000C6C: _dl_start (rtld.c:328)
==7753== by 0x4000856: ??? (in /lib/ld-2.10.1.so)
참고로 제 컴퓨터는 커널 Linux 2.6.31-14-generic, 그놈 2.28.1 이며, CPU는 64비트인데, 32비트 우분투 9.10으로 설치되어 있습니다.
Ubuntu 9.10이 설치된 노트북에서는 이전과 같이 Valgrind가 이상한 에러를 만들지 않는 것으로 봐서, 소프트웨어의 에러가 아니라 단순히 설정이 잘못 되어있을 가능성도 있다고 생각됩니다.