c语言 - 在瓦尔格林德"Syscall param execve(argv) points to unaddressable byte(s)"



使用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(full_path,run_arguments);线上,问题源于char** run_arguments = malloc(sizeof(char*)*NUM_ARGS);线上的malloc

我犯了什么错误导致valgrind给出这个输出?

实参列表必须以NULL指针结束。向run_arguments数组中添加一个元素,并使其为NULL指针。

如果没有空指针参数,exec函数在搜索终止符时会越界,并将每个非空元素视为应该传递给程序的参数。这会导致未定义行为

这在exec手册页中有明确的说明。

最新更新