2011-09-27 3 views
0

나는 프로그램이 그래서 내 특정 인수와 함께 실행할 수있는 위치를 찾기 위해 리눅스 시스템에서 절대 경로를 테스트하기 위해 노력하고있어. 문제는, 내가 그것을 발견 할 때, 동적 인 할당 된 메모리를 해제함으로써 메모리 누출뿐만 아니라 올바른 경로에 더 많은 문자열을 계속 추가한다는 것이다. 스택 덤프에 대한 픽스 만이 해제되지 않습니다 (ret). 나는 "ls"로 예제를 실행할 때 프로그램을 찾고 실행하지만 gdb를 기반으로한다고 믿는다.execv와 및 테스트 올바른 절대 경로

for(j = 0; j < i; j++, path = NULL) 
    { 
    token = strtok_r(path, delim, &saver); 
    if(token == NULL) 
    break; 
    else 
    { 
     strncat(ret, token, 80); 
     strncat(ret, "/", 1); 
     strncat(ret, command, 80); 
     args[0] = ret; 
     printf("%s\n", ret); 
     m = execv(ret, args); 
     printf("%d\n", m); 
     if(m < 0) 
     { 
      free(ret); 
      ret = malloc(120*sizeof(char)); 
     } 
     else 
     break; 
    } 
} 

구분 기호 문자는 콜론 (:)이며 strncat이 올바르게 수행되었다고 생각합니다. 도움을 주셔서 감사합니다.

+0

문제를 재현하는 데 사용할 수있는 최소한의 완전하고 작업 코드 예제를 게시하시기 바랍니다. 버그가있는 곳에서 제공 한 코드에서 명확하지 않습니다. 예를 들어, 루프에 들어가기 전에 어떻게 든'ret'를 초기화합니까? 그렇지 않다면 - 당신이 간다. –

답변

0

malloc() 때마다 새로운 초기화되지 않은 메모리가 생깁니다. 이 ret위한 방법 밖에서 120 바이트가 될 수 ret에서 NUL 문자를 찾기 위해 노력할 것으로 strncat()는 세그먼트 오류를 ​​올릴 것이다.

malloc을 으로 바꾸거나 malloc을 호출 한 후에 memset(ret, 0, 120*sizeof(char));을 사용하십시오. 또는 어떻게 든 첫 번째 strncat 전에 제로와 ret을 입력합니다.

당신이 경우에 그것을 깨는 아니에요 이유 여유 인해 ret 스택에 선언되는 수 - 다음 하지 무료/malloc에 ​​그것을 할. 아니면 너무 ret의 초기 값 모두 0이다 일어날 수있는 -하지만 이후 malloc 호출은 초기화되지 않은 메모리를 얻을 수 있습니다.

PS : 당신은 당신이 execv를 사용 하시겠습니까? 이것은 현재 프로세스를 대체합니다. 하지만 당신이 포크라고 생각합니다.