2012-10-09 3 views
0

Psudo 코드가 나옵니다. 그러나 왜 이것이 힙을 깨뜨리는 지 알 수 있습니까? urlencode 함수는 다른 곳에서 다운로드 된 표준 라이브러리 함수이며 설계된대로 작동하는 것으로 보입니다. 실제 코드에서 동적 크기 char 배열을 사용하고 있으므로 main에서 malloc 요구 사항의 이유.함수에 char을 건네 주면 아래 코드

/* Returns a url-encoded version of str */ 
/* IMPORTANT: be sure to free() the returned string after use */ 
char *urlencode(char *str) { 
    //char *pstr = str, *buf = malloc(strlen(str) * 3 + 1), *pbuf = buf; 
    char *pstr = str, *buf = malloc(strlen(str) * 3 + 1), *pbuf = buf; 
    while (*pstr) { 
    if (isalnum(*pstr) || *pstr == '-' || *pstr == '_' || *pstr == '.' || *pstr == '~') 
     *pbuf++ = *pstr; 
    else if (*pstr == ' ') 
     *pbuf++ = '+'; 
    else 
     *pbuf++ = '%', *pbuf++ = to_hex(*pstr >> 4), *pbuf++ = to_hex(*pstr & 15); 
    pstr++; 
    } 
    *pbuf = '\0'; 
    return buf; 
} 

int testFunction(char *str) { 
    char *tmpstr; 
    tmpstr = urlencode(str); 
    // Now we do a bunch of stuff 
    // that doesn't use str 
    free(tmpstr); 
    return 0; 
    // At the end of the function, 
    // the debugger shows str equal 
    // to "This is a test" 
} 

int main() { 
    char *str = NULL; 
    str = malloc(100); 
    strcpy(str, "This is a test"); 
    testFunction(str); 
    free(str); // Debugger shows correct value for str, but "free" breaks the heap 
    return 0; 
} 

감사합니다.

+1

segfault가 있습니까? 또는 이중 자유/힙 손상 오류가 구체적으로? – PherricOxide

+1

여기에 문제 없지만'char'가 ASCII 범위를 벗어나면'to_hex (* pstr >> 4)'는 문제를 일으킬 수 있습니다.'0xF '로도 마스크하는 것이 더 안전합니다. –

+2

나를 위해 잘 작동하고 Valgrind는 오류를 발생시키지 않습니다. '// 이제 str을 사용하지 않는 많은 것들을 처리합니까?'라는 코드가 힙을 손상시키지 않았습니까? Valgrind에서 실행 해 보셨습니까? –

답변

1

나는 str이 이미 free(tmpstr);에 의해 해제되었다고 생각합니다. urlencode -function의 동작을 살펴보십시오. 반환 값으로 새 문자열을 생성하지 않지만 (변경된) 입력 문자열을 다시 전달하는 것처럼 보입니다.

+2

아니요, 그게 아니라,'malloc'의'buf'와 그것을 반환합니다. –

0

문제는 str의 초기 malloc에 ​​대한 크기 계산에 문제가있는 것으로 판명되었습니다. 주석을 주셔서 감사합니다. 불행히도 대답을 주석으로 표시 할 수는 없습니다.

이것이 부적절한 방법 일 경우 알려 주시기 바랍니다.

+1

질문을 삭제할 수 있다고 생각합니다. 앞으로 실제 코드를 게시하거나 예제 코드가 실제로 동일한 문제를 겪고 있는지 확인하십시오 (그렇지 않은 경우 차이가 해결 방법으로 이어질 수 있음). – ugoren