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;
}
argv [tokens.size() +1]'. 이것은 바이퍼 오버런입니다. –
@ n.m. argv를위한 충분한 공간을 적절히 할당하지 못하고 있습니까? 잠깐, 무슨 말인지 알 겠어. – MipsMoreLikeWhips
@ n.m. 빠른 수정을 가져 주셔서 감사합니다. – MipsMoreLikeWhips