2010-05-13 7 views
4

다음 사례에서 코드 누수가 발생하는 이유를 이해하는 데 문제가 있습니다. 차이점은버퍼에 할당 할 때 fgets가 누출 됨

while(NULL!=fgets(buffer,length,file))//doesnt leak 
while(NULL!=(buffer=fgets(buffer,length,file))//leaks 

으로 생각했습니다.

전체 코드는 다음과 같습니다.

#include <stdio.h> 
#include <stdlib.h> 

#define LENS 10000 

void no_leak(const char* argv){ 
    char *buffer = (char *) malloc(LENS); 
    FILE *fp=fopen(argv,"r"); 

    while(NULL!=fgets(buffer,LENS,fp)){ 
    fprintf(stderr,"%s",buffer); 

    } 
    fclose(fp); 
    fprintf(stderr,"%s\n",buffer); 
    free(buffer); 


} 
void with_leak(const char* argv){ 
    char *buffer = (char *) malloc(LENS); 
    FILE *fp=fopen(argv,"r"); 

    while(NULL!=(buffer=fgets(buffer,LENS,fp))){ 
    fprintf(stderr,"%s",buffer); 

    } 
    fclose(fp); 
    fprintf(stderr,"%s\n",buffer); 
    free(buffer); 


} 

답변

7

가리 키기 위해 사용 된 버퍼를 재 할당하기 때문에. 코드 끝 부분의 free(buffer);에 도착할 때 버퍼는 NULL을 가리킬 것입니다 (while 루프를 종료하기 위해 테스트했기 때문에). 따라서 무료로 전화를 걸면 원래 포인터를 'd, 당신은 아무것도 그것을 부르고있어.

+0

이것을보고 주위를 둘러 보는 방법에 대해 궁금한 사람은 임시 포인터를 사용하여'fgets()'의 반환 값을 보관하십시오. – MortalMan

1

성공적으로 읽으면 괜찮을 것입니다. 그러나 파일의 끝에 도달하면, fgets는 NULL을 반환 할 것이고 따라서 버퍼는 NULL이 될 것이고 당신은 그것을 풀 수 없을 것이다.

1

fgets가 NULL을 반환하면 누수가 발생합니다. NULL 포인터에서 무료로 호출하는 것은 합법적이지만, 당연히 원래 포인터를 잃어 버렸습니다.

2

fgets()NULL 인 경우 buffer은 원래 값을 잃어 더 이상 free이 될 수 없습니다.

관련 문제