【问题标题】:Getting "Syscall param execve(argv) points to unaddressable byte(s)" in valgrind在 valgrind 中获取“Syscall param execve(argv) 指向不可寻址字节”
【发布时间】:2017-03-30 08:15:20
【问题描述】:

使用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 给出这个输出?

【问题讨论】:

    标签: c valgrind


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2023-03-19
      • 2015-09-21
      • 1970-01-01
      • 1970-01-01
      • 2021-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多