2012-02-24 1 views
5

의 크기를 읽어Valgrind의 잘못된, 나는 ... 그 날이 <code>char *url pointer</code>을 남용 함께 할 수있는 뭔가있어 확신이 코드 조각에 대한 <code>invalid read size of 1</code>을 얻고 왜 내가 해결하지 못할 내 인생을 위해 1

char *extractURL(char request[]) 
{ 
char *space = malloc(sizeof(char *)); 
space = strchr(request, ' ')+1; 
char *hostend = malloc(sizeof(char *)); 
hostend = strchr(request, '\r'); 
int length = hostend - space; 
if (length > 0) 
{ 
    printf("Mallocing %d bytes for url\n.", length+1); 
    char *url = (char *)malloc((length+1)*sizeof(char)); 
    url = '\0'; 
    strncat(url, space, length); 
    return url; 
} 
//else we have hit an error so return NULL 
return NULL;  
} 

내가 점점 오전 Valgrind의 오류는 다음과 같습니다 올바른 방향으로

==4156== Invalid read of size 1 

==4156== at 0x4007518: strncat (mc_replace_strmem.c:206) 

==4156== by 0x8048D25: extractURL() 

==4156== by 0x8048E59: processRequest() 

==4156== by 0x8049881: main() 

==4156== Address 0x0 is not stack'd, malloc'd or (recently) free'd 

수있는 사람 '포인트'나?

+0

URL에 메모리를 할당 한 다음 널 포인터로 설정하십시오. (url = '\ 0';) 아마도 url [0] = '\ 0'을 설정한다는 의미였습니까? ? – Joe

+0

아마도 strncpy를 사용하고 싶습니까? – Cascabel

+0

처음 두 개의'malloc' 호출로 메모리 누수가 발생합니다. 그런데 완전히 잘못된 것입니다. 왜'size'를'char' * 포인터 *의 크기로 예약할까요? 세 번째'malloc'은 또한 잠재적 인 혼란의 징후를 보여줍니다 : (1) malloc 반환을 던지지 말고, 버그 만 숨 깁니다. (2) sizeof (char)는 정의에 따라 1이고, 'malloc'은 할당하고자하는'char'의 번호입니다. –

답변

8

여기

char *url = malloc((length+1)*sizeof(char)); 
url = '\0'; 
strncat(url, space, length); 

은 즉시 NULLurl을 설정하여 malloc으로 할당 된 메모리를 잃게됩니다. '\0'은 0이며, 이는 null 포인터 상수입니다. 그런 다음 잘못된 메모리 위치에 무언가를 strncat 시도하십시오.

는 당신은 아마이

*url = '\0'; 

을 설정하는 것을 의미했다.

+0

그렇다면 strncat은 unintialized 값에 조건부 점프를 수행하지만 그렇지 않습니까? – DMcB1888

+0

글쎄, 실제로'strncat (NULL, something, n)'을 호출 할 때 segfault를 기대 하겠지만, valgrind가 그것을보고 할 수도있다. –