2016-11-21 4 views
0

제목을 자세히 설명하기 만하면 execvp()가 호출 될 때 매우 정교하고 임의의 잘못된 주소가 표시됩니다.C++ 사용자 정의 셸 정기적 인 잘못된 주소

나는 에코, 나노, CD를 사용하고, 때때로 한 번씩 나는 나쁜 주소로 치게 될 것입니다.

문자열의 벡터를 사용하여 문자열의 벡터를 const char **로 변경하고 마지막에 null을 추가합니다. null이 항상 읽히지 않는 것처럼 보입니다.

도움을 주시면 감사하겠습니다. 참조

코드 :

int parse::sh_execute() 
{ 
     const char **argv = new const char* [tokens.size()+1]; 
     for (int i = 0; i < tokens.size(); ++i) 
     { 
       argv[i] = tokens[i].c_str(); 
     } 

     argv[tokens.size()+1] = NULL; 


     pid_t pid, wpid; 
     pid = fork(); 
     int status; 


     if (pid < 0) 
     { 
       perror("fork error"); 
       exit(EXIT_FAILURE); 
     } 
     else if(pid == 0) 
     { 
       //child process 
       if(execvp(argv[0], (char **)argv)== -1) 
       { 
         perror("Child process error"); 
       } 
       exit(EXIT_FAILURE); 
     } 
     else 
     { 
       do 
       { 
        wpid = waitpid(pid, &status, WUNTRACED); 
       } 
       while (!WIFEXITED(status) && !WIFSIGNALED(status)); 
     } 
     return 1; 

} 

    int parse::sh_cd() 
{ 
     if (tokens.size() == 1) 
     { 
       std::cout << "Error: No argument for cd" << std::endl; 

     } 
     else 
     { 
       int rc = chdir(tokens[1].c_str()); 
       if (rc < 0) 
       { 
         printf ("Error changing directory: %s\n",strerror(errno)); 
       } 
     } 
     return 1; 
} 
+1

argv [tokens.size() +1]'. 이것은 바이퍼 오버런입니다. –

+0

@ n.m. argv를위한 충분한 공간을 적절히 할당하지 못하고 있습니까? 잠깐, 무슨 말인지 알 겠어. – MipsMoreLikeWhips

+0

@ n.m. 빠른 수정을 가져 주셔서 감사합니다. – MipsMoreLikeWhips

답변