在Valgrind中获取“Syscall param execve(argv)指向不可寻址的字节”

时间:2016-11-16 08:09:15

标签: 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_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);行上,问题源于mallocchar** run_arguments = malloc(sizeof(char*)*NUM_ARGS);

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

1 个答案:

答案 0 :(得分:3)

参数列表必须以NULL指针终止。将一个元素添加到run_arguments数组,并使其成为NULL指针。

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

the exec manual page中明确指出了这一点。