2017-12-01 29 views
0

문제 :FREAD()는 Valgrind의 오류가 발생합니다 : "조건부 점프 또는 이동이 초기화되지 않은 값 (들)에 따라"

노드 Valgrind의에서 저장 text_를 검색 할 때 작품의 데이터를로드하지만, "조건부 점프"를 던집니다. text_는 여전히 올바르게 검색되어 표시됩니다. 문제의 원인은 무엇

:

이것은 코드가 ReadFile을() 함수의 부분이 특정 FREAD (인)이 문제가 발생합니다.

int readFile(char **text, ...) 
    ... 
    size_text = filesize - previous_position; 
    *text = (char *)malloc(size_text + 1); 
    fread(*text, 1, size_text, input); 

Valgrind의 메시지 :

==18139== Conditional jump or move depends on uninitialised value(s) 
==18139== at 0x48303C7: __GI_strlen (vg_replace_strmem.c:455) 
==18139== by 0x48EA17F: vfprintf (vfprintf.c:1637) 
==18139== by 0x48EF955: printf (printf.c:33) 
==18139== by 0x108F6A: game (version-3.c:243) 
==18139== by 0x109085: main (version-3.c:287) 
==18139== Uninitialised value was created by a heap allocation 
==18139== at 0x482D27C: malloc (vg_replace_malloc.c:299) 
==18139== by 0x108BBC: readFile (version-3.c:125) 
==18139== by 0x108D4A: BuildTree (version-3.c:197) 
==18139== by 0x109074: main (version-3.c:286) 
==18139== 

솔루션

널 (NULL) 종료 수정이 오류를 추가. 초기 가정은 null 종결자를 잘못 배치했기 때문입니다. * text [size_text] = '\ 0'; -> 오류가 발생했습니다 (* text) [size_text] = '\ 0'; -> 오류를 수정합니다.

+1

fread가 예상 바이트 수를 읽고 있는지 확인하십시오. size_text 바이트가 필요합니다. 그것은 당신이 읽은 금액입니까? 만약 당신이 덜 읽으면이 에러가 발생합니다. – pm100

+0

cos_t size_text를 결정하기 위해 멋진 twiddling을합니다. – pm100

+0

'size_text + 1' 바이트를 할당하지만'fread'로'size_text' 바이트 만 읽습니다. 그래서 그것은 1 바이트를 초기화되지 않은 상태로 남겨 둡니다. – user3386109

답변

2

fread()에 오류가 발생하지 않습니다. __GI_strlen에서 발생합니다. 이것이 의미하는 바는 그 기능이 로직에 의존하는 변수가 완전히 초기화되지 않았거나 완전히 초기화되지 않았다는 것입니다.

당신이, 당신은 문제가 무엇인지 추측 할 수 *strlen가 (C 문자열의 종료 \0를 제외하고, 문자의 수를 계산) 할 것으로 예상되는 것을 알고 있기 때문에

: 당신이 malloc()이는 '특정 크기의 버퍼를 에드, 그러나 당신을 \0 터미네이터를 포함한 문자열이 완전히 차지하지 않습니다. 그래서 unitialised, 따라서 오류가 남아 버퍼에 후행 공백이 있습니다.

따라서 반환 값 fread()을 확인하여 정확하게 읽은 바이트 수를 확인하는 것이 좋습니다. 요청할 때 많은 요소 (바이트)를 읽을 수있는 것은 아닙니다. 오류를 반환하거나 의 숫자를 읽은 다음 지정한 한도 인까지 읽을 수 있습니다.

그리고 버퍼에 널 종결자를 명시 적으로 배치하는 것이 좋습니다. (당신이 그것을 놓치고있어.)

+0

널 터미네이터를 다시 추가하고 처음 실수 한 부분을 발견했습니다. 대신 (* 텍스트) [size_text] = '\ 0'; * text [size_text] = '\ 0'; 오류가 발생하여 fread() 함수를 명시 적으로 추가하지 않아도 null 종결자가 이미 존재한다고 생각하게되었습니다. – ARS