获得;Syscall param execve(argv)指向不可寻址字节;在瓦尔格林
使用获得;Syscall param execve(argv)指向不可寻址字节;在瓦尔格林,c,valgrind,C,Valgrind,使用valgrind--leak check=yes运行以下C程序会导致valgrind给出一个输出,表明 Syscall param execve(argv) points to unaddressable byte(s) 计划如下: int main() { const int NUM_ARGS = 3; char** run_arguments = malloc(sizeof(char*)*NUM_ARGS); run_arguments[0] = "ls"; run_a
valgrind--leak check=yes运行以下C程序会导致valgrind给出一个输出,表明
Syscall param execve(argv) points to unaddressable byte(s)
计划如下:
int main() {
const int NUM_ARGS = 3;
char** run_arguments = malloc(sizeof(char*)*NUM_ARGS);
run_arguments[0] = "ls";
run_arguments[1] = "-l";
run_arguments[2] = "--color";
char* full_path = "/bin/ls";
int pid = fork();
if (pid == 0)
execv(full_path,run_arguments);
else {
int status;
waitpid(pid,&status,WUNTRACED);
free(run_arguments);
}
return 0;
}
根据valgrind的说法,问题发生在execv行(完整路径,运行参数)代码>,问题源于行char**run\u arguments=malloc上的malloc
(sizeof(char*)*NUM\u ARGS)代码>
我犯了什么错误导致valgrind给出这个输出?参数列表必须由NULL
指针终止。将一个元素添加到run_arguments
数组中,并使其成为NULL
指针
如果没有null pointer参数,exec
函数在搜索终止符时会越界,并将每个非null元素视为应传递给程序的参数。这会导致未定义的行为
这一点在本节中已明确指出