2016-11-21 8 views
0

Чтобы подробно описать заголовок, я получаю очень редкие случайные плохие адреса при вызове execvp().C++ Custom Shell Periodic Bad Address

Я могу повторить эхо, использовать nano, cd, и каждый раз через некоторое время меня поразит плохой адрес.

Я использую вектор строк, меняя вектор строк на const char ** и добавляя нуль в конце. Кажется, что нуль не всегда читается.

Любая помощь приветствуется.

Код для ссылки:

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

@ н.м. Я не правильно выделяю достаточно места для argv? Подожди, я понимаю, о чем ты. – MipsMoreLikeWhips

+0

@ н.м. Благодарю за быстрое исправление. – MipsMoreLikeWhips

ответ