2013-04-19 3 views
0

Valgrind가 '여전히 도달 할 수있는'블록에 대해 경고하게 만드는 원인을 파악하려고합니다. 코드를 검토 한 결과 free()가 누락되었습니다. 나는 --leak 검사로 = 예 = --show-도달 예 옵션을 실행하는 노력이 출력의 예입니다 : 나는 printEstBasica처럼 ('인쇄'기능을 참조하거나 이해Valgrind - 차단할 수있는 블록이 아직 남아 있습니까?

==2999== 616 bytes in 7 blocks are still reachable in loss record 8 of 9 
==2999== at 0xD9C3: calloc (vg_replace_malloc.c:597) 
==2999== by 0x3188FA: _xpc_calloc (in /usr/lib/system/libxpc.dylib) 
==2999== by 0x3191D4: _xpc_base_create (in /usr/lib/system/libxpc.dylib) 
==2999== by 0x31FBEA: xpc_string_create (in /usr/lib/system/libxpc.dylib) 
==2999== by 0x31EDFD: xpc_dictionary_set_string (in /usr/lib/system/libxpc.dylib) 
==2999== by 0x320E8C: _libxpc_initializer (in /usr/lib/system/libxpc.dylib) 
==2999== by 0x1BE7D: libSystem_initializer (in /usr/lib/libSystem.B.dylib) 
==2999== by 0x7FFF5FC0FDA5: ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) (in /usr/lib/dyld) 
==2999== by 0x7FFF5FC0FAF1: ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) (in /usr/lib/dyld) 
==2999== by 0x7FFF5FC0D2E3: ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int, ImageLoader::InitializerTimingList&) (in /usr/lib/dyld) 
==2999== by 0x7FFF5FC0D27C: ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int, ImageLoader::InitializerTimingList&) (in /usr/lib/dyld) 
==2999== by 0x7FFF5FC0E0B6: ImageLoader::runInitializers(ImageLoader::LinkContext const&, ImageLoader::InitializerTimingList&) (in /usr/lib/dyld) 


==2999== 4,096 bytes in 1 blocks are still reachable in loss record 9 of 9 
==2999== at 0xC713: malloc (vg_replace_malloc.c:274) 
==2999== by 0x17F3F7: __smakebuf (in /usr/lib/system/libsystem_c.dylib) 
==2999== by 0x175D19: __swsetup (in /usr/lib/system/libsystem_c.dylib) 
==2999== by 0x1766C3: __vfprintf (in /usr/lib/system/libsystem_c.dylib) 
==2999== by 0x17618D: vfprintf_l (in /usr/lib/system/libsystem_c.dylib) 
==2999== by 0x17F2CF: printf (in /usr/lib/system/libsystem_c.dylib) 
==2999== by 0x100003D21: printEstBasica (mod_dados.c:100) 
==2999== by 0x100001635: main (mod_main.c:179) 

의 선), 나는 오직 printf 나 fprintf를 사용한다 ... 다른 것들은 내가 무엇인지 알아 내지 못한다. 나는 다른 사람들이 컴파일러가 사용하는 추가 정보를 참조 할 수 있다고 말하는 것을 읽었다. 모르겠다. 한가지 생각해 보니 : 나는 서로 다른 크기의 데이터 집합 (프로그램에 의해 처리됨)에서 valgrind를 실행했습니다. 크기가 다르지만 여전히 도달 할 수있는 바이트 수는 항상 같습니다.

미리 감사드립니다. !

답변

0

Valgrind가 '여전히 도달 할 수있는'블록에 대해 경고하게 만드는 원인을 파악하려고합니다.

당신

--show-reachable=yes 플래그 그들에 대해 당신에게 Valgrind의 물었다. 그들을보고 싶지 않다면, 그 깃발을 사용하지 마십시오.

이제 실제 질문은 "도달 할 수있는 블록은 무엇이며 신경 써야하나요?"라는 질문입니다.

답변 : 그렇지 않습니다. 아직도 도달 할 수있는 구획은 자유로울다는 것을 의미한다 (만약에 그들을 도달 할 수 있었다 아직도 발견 할 수 있었다 ==는 그 (것)들을 도달한다), 다만 배려).

int DoSomething() 
{ 
    // Heap-allocated so as not to exhaust stack. 
    // Allocated only once. 
    static char *const error_buf = malloc(10000); 
    return DoSomethingWithErrorBuf(error_buf); 
} 

int main() 
{ 
    return DoSomething(); 
} 
: 여기

는 "아직 도달"생성하는 프로그램의 예입니다
관련 문제