获得;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元素视为应传递给程序的参数。这会导致未定义的行为

这一点在本节中已明确指出