在内存泄漏中获取“Syscall param execve(argv)points to uninitialised byte(s)”?

az31mfrm  于 2023-08-03  发布在  其他
关注(0)|答案(1)|浏览(131)

使用valgrind --leak-check=yes运行下面的C程序会导致valgrind给出一个输出,指示“Syscall param execve(argv)points to uninitialised byte(s)”
下面的代码是:

  1. execv(commandCopy, cmd->argv);
  2. fprintf(stderr, "%s: Command not found.\n", commandCopy);
  3. free(cmd->argv);
  4. free_cmd(cmd);
  5. _exit(0);

字符串
根据Valgrind的说法,问题发生在线路上:

  1. ==582489== Syscall param execve(argv) points to uninitialised byte(s)
  2. ==582489== at 0x49630FB: execve (syscall-template.S:120)
  3. ==582489== by 0x109FE5: parse_cmd (mysh.c:318)
  4. ==582489== by 0x109C53: parse_cmd (mysh.c:228)
  5. ==582489== by 0x10A25E: main (mysh.c:388)


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

7y4bm7vi

7y4bm7vi1#

我们慢慢说吧。

  • “系统调用”

系统调用(或系统调用)是用户代码对内核进行函数调用的方式。常见的系统调用有openreadwritefutex。大约有400个系统调用。

  • “param”

系统调用的参数。

  • “执行”

用另一个可执行文件替换当前可执行文件的系统调用。

  • “argv”

参数向量,这是将传递给新可执行文件的参数。
手册页上说
argv是传递给新程序的参数字符串数组。按照惯例,这些字符串中的第一个应该包含与正在执行的文件相关联的文件名。envp是一个字符串数组,通常是key=value的形式,它作为环境传递给新程序。argv和envp都必须以NULL指针结束。
(我加了粗体)。

  • “未初始化字节”

某些内存尚未赋值。
你的argvNULL,或者更有可能的是,你忘记了NULL终止指向char*的指针数组,而char*是由argv组成的。

展开查看全部

相关问题