2011-12-24 1 views
2

valgrind 내에 내 C 바이너리의 디버그 버전을 실행 중입니다. 많은 오류가 반환됩니다. Conditional jump or move depends on uninitialised value(s). 심볼 테이블을 사용하여이 함수에서 초기화되지 않은 값은 어디에 있습니까?

, valgrind 어디에서이 문제에 대한 내 프로그램에서 찾아야하는지 알려줍니다 :

==23899== 11 errors in context 72 of 72:                                                  
==23899== Conditional jump or move depends on uninitialised value(s)                                           
==23899== at 0x438BB0: _int_free (in /foo/bar/baz)                               
==23899== by 0x43CF75: free (in /foo/bar/baz)                                
==23899== by 0x4179E1: json_tokener_parse_ex (json_tokener.c:593)                                           
==23899== by 0x418DC8: json_tokener_parse (json_tokener.c:108)                                            
==23899== by 0x40122D: readJSONMetadataHeader (metadataHelpers.h:345)                                        
==23899== by 0x4019CB: main (baz.c:90) 

I가 호출하는 다음 함수 readJSONMetadataHeader(...)json_tokener_parse() :

int readJSONMetadataHeader(...) {                                                                                         
    char buffer[METADATA_MAX_SIZE]; 
    json_object *metadataJSON; 
    int charCnt = 0; 
    ... 
    /* fill up the `buffer` variable here; basically a */ 
    /* stream of characters representing JSON data... */ 
    ... 
    /* terminate `buffer` */ 
    buffer[charCnt - 1] = '\0'; 
    ... 
    metadataJSON = json_tokener_parse(buffer); 
    ... 
} 

기능 json_tokener_parse()에서 차례는 다음과 같습니다 :

struct json_object* json_tokener_parse(const char *str)                                              
{                                                            
    struct json_tokener* tok;                                                     
    struct json_object* obj;                                                     

    tok = json_tokener_new();                                                     
    obj = json_tokener_parse_ex(tok, str, -1);                                                 
    if(tok->err != json_tokener_success)                                                  
     obj = (struct json_object*)error_ptr(-tok->err);                                               
    json_tokener_free(tok);                                                      
    return obj;                                                         
} 

추적을 마치면 json_tokener_parse()으로 입력되는 char [] (또는 const char *) 변수 buffer이 초기화되지 않은 것처럼 보입니다. 다시 json_tokener_parse_ex()으로 입력됩니다.

그러나 변수 은 데이터로 채워지고 json_tokener_parse() 함수가 호출되기 전에 종료됩니다.

valgrind은 왜이 값이 초기화되지 않았습니까? 내가 뭘 놓치고 있니?

+0

당신의 코드와 주석이 무엇이든 갈 경우,'charCnt'는 사용될 때 초기화되지 않습니다. – GManNickG

+0

또는 아마도'buffer'가 unitialized이며, 단지 NUL로 종료됩니다. – cnicutar

+0

명확성이 부족해서 죄송합니다. 'buffer'가'char' 값으로 채워지면'charCnt' 값이 증가합니다. 그리고 관련 변수 만 복사하여 붙여 넣습니다. 이제는 고정되어있는 '0'으로 초기화된다는 것을 잊지 않습니다. 감사! –

답변

2

charCnt이 초기화되지 않았습니다.

buffer에서 왔는지 확인하려면 간단히 = {0}으로 초기화하십시오. 버퍼의 널 종료도 폐기됩니다.

+0

'{0}'을'buffer '에 추가하려고 시도했지만, 같은 함수와 같은 줄에서 같은 오류를 계속 얻었습니다. –

1

보이지 않는 json_tokener_parse_ex()을보십시오. 초기화되지 않은 것을 해제하려고 시도하는 것 같습니다.

1
buffer[charCnt - 1] = '\0'; 

charCnt가 제로로 발생하는 경우가 적어도이 실패합니다.

+0

감사합니다. 빈 '버퍼'로 인해 메타 데이터가 발생하지 않고 앱이 오류 상태 (코드가 명확하게 표시되지 않음)와 함께 일찍 종료되므로 잠재적 인 원인으로 이미이를 제거했습니다. –

2

응용 프로그램이 정적으로 링크 된 것처럼 valgrind 오류 보고서에서 확인합니다 (특히 free이 기본 실행 파일에있는 것으로 보이고 libc.so.6이 아닌 것 같습니다).

Valgrind는 정적으로 링크 된 응용 프로그램의 가짜 오류를보고합니다.

보다 정확하게 말해, libc에는 고의적 인 "do not care"오류가 있습니다. 응용 프로그램을 동적으로 연결하면 이러한 오류가 기본적으로 억제됩니다 (Valgrind와 함께 제공되는 억제 파일을 통해).

그러나 응용 프로그램을 정적으로 링크 할 때 Valgrind는 결함 코드가 libc.a에서 왔음을 알 수 없으므로이를보고합니다.

일반적으로 Linux에서 응용 프로그램을 정적으로 링크하는 것은 좋지 않은 아이디어입니다 (TM). 이중 그래서 :

Valgrind의에서 이러한 응용 프로그램을 실행 Valgrind의이 malloc/free 호출을 가로 챌 수 없습니다 효과적으로에만 초기화되지 않은 메모리 읽기 을 잡을 것없는 힙 버퍼 오버 플로우 (또는 다른 힙 손상 버그)이 그 보통 좋다.