2014-11-10 1 views
2

Valgrind는 printf 및 puts와 같은 함수에서 여전히 도달 할 수있는 "오류"를보고하고 있습니다. 나는 이것에 대해 무엇을해야할지 정말로 모른다. 나는 그것이 학교 프로젝트이기 때문에 그것을 없애고 전혀 오류가 없어야한다. 이 문제를 어떻게 처리합니까? 보고서에서 나는이 함수들이 malloc을 사용하고 있다는 것을 알았지 만, 나는 항상 그들이 스스로 메모리를 처리했다고 생각했다. 저는 Mac OS X을 사용하고있어서 valgrind와 OS 사이에 문제가있을 수 있습니까?여전히 puts 및 printf로 연결할 수 있습니다.

샘플 코드 :이이 표준 입출력 라이브러리로 인해 발생

==1954== 16,384 bytes in 1 blocks are still reachable in loss record 77 of 77 
==1954== at 0x47E1: malloc (vg_replace_malloc.c:300) 
==1954== by 0x183855: __smakebuf (in /usr/lib/system/libsystem_c.dylib) 
==1954== by 0x198217: __swsetup (in /usr/lib/system/libsystem_c.dylib) 
==1954== by 0x1B1158: __v2printf (in /usr/lib/system/libsystem_c.dylib) 
==1954== by 0x1B16AF: __xvprintf (in /usr/lib/system/libsystem_c.dylib) 
==1954== by 0x188B29: vfprintf_l (in /usr/lib/system/libsystem_c.dylib) 
==1954== by 0x18696F: printf (in /usr/lib/system/libsystem_c.dylib) 
==1954== by 0x1000036F3: twittear (main.c:138) 
==1954== by 0x100003C8D: main (main.c:309 
+1

안녕하세요. 이제 샘플 코드를 추가했습니다! –

+0

실제 오류는 무엇입니까? 그리고 당신은 그것이''puts()'를 따르는 반환에 있지 않을 것이라고 확신합니까? 즉'queue_see_first()'는 반환/종료 전에 해제되어야하는 메모리 ('user'로 반환)를 할당합니까? –

+0

queue_input은 이전에 생성되었으며 다른 곳에서 삭제되었습니다. queue_see_first는 대기열에서 사용자가 해제해야 할 때 큐의 첫 번째 요소에 대한 포인터를 반환합니다. 실제 오류가 아니더라도 계속 진행되고있는 것을 알고 싶습니다. 도움 팀에 감사드립니다! –

답변

1

:이 오류는

void twittear(array_t* array_tweets, hash_t* hash, queue_t* queue_input){ 

    char* user = queue_see_first(queue_input); 
    char key[1] = "@"; 

    if (!user || user[0] != key[0]) { 
     puts("ERROR_WRONG_COMAND"); 
     return; 
    } 

    queue_t* queue_keys = queue_create(); 
    char* text = join_text(queue_input, queue_keys); 

    if (!text) { 
     puts("ERROR_TWEET_TOO_LONG"); 
      queue_destroy(queue_keys, NULL); 
     return; 
    } 

    int id = new_tweet(array_tweets, text); 
    while (!queue_is_empty(queue_keys)) 
     hash_tweet(hash, queue_dequeue(queue_keys), id); 
    queue_destroy(queue_keys, NULL); 
    printf("OK %d\n", id); 
} 

ERROR를 사용하는 것을 박았 나 printf와의에 나타납니다. "Hello World"프로그램은 printf 나 fprintf를 stdout이나 stderr로 재현하기에 충분합니다. 처음 FILE에 쓸 때 malloc을 사용하여 출력 버퍼를 할당합니다. 이 버퍼 할당은 __swsetup() 함수 (Apple에서 LibC 소스를 다운로드하면 거기에 표시되지만 사실 FreeBSD에서 복사되므로 많은 * BSD 시스템이 동일한 기능을 갖습니다)에서 발생합니다. 이제 fclose()를 호출하면 버퍼가 해제됩니다. 표준 스트림 (stdout, stderr)의 문제는 일반적으로 버퍼를 닫지 않기 때문에 결과적으로이 버퍼는 결코 해제되지 않습니다.

프로그램을 종료하기 전에 stdout 및/또는 stderr에 fclose()를 추가하여이 "누출"을 제거 할 수 있습니다. 그러나 솔직히, 그것을 할 필요가 없습니다, 당신은 그것을 무시할 수 있습니다. 이것은 크기가 커지지 않을 고정 된 크기의 버퍼이므로 "누출"이 아닙니다. 프로그램 끝에서 stdout/stderr를 닫으면 아무 것도 유용하지 않습니다.

1

Valgrind는 Mac OS X에서 약간 이상합니다. 일부 시스템 라이브러리에는 완전한 억제 기능이 없습니다. (즉, 일부 "기대"된 누설을 제대로 무시하지 않습니다.) 결과에는 자주 이와 같은 몇 가지 잘못된 결과가 포함될뿐 아니라 memcpy()과 같은 기능의 최적화로 인한 일부 버퍼 오버런이 포함됩니다.

내 충고는? 도구에 익숙한 매우이 아닌 한 Mac OS X에서 valgrind를 사용하지 마십시오. 최상의 결과를 얻으려면 Linux 시스템에서 응용 프로그램을 컴파일하고 테스트하십시오.