使用valgrind --leak-check=yes运行下面的C程序会导致valgrind给出一个输出,指示“Syscall param execve(argv)points to uninitialised byte(s)”
下面的代码是:
execv(commandCopy, cmd->argv);
fprintf(stderr, "%s: Command not found.\n", commandCopy);
free(cmd->argv);
free_cmd(cmd);
_exit(0);
字符串
根据Valgrind的说法,问题发生在线路上:
==582489== Syscall param execve(argv) points to uninitialised byte(s)
==582489== at 0x49630FB: execve (syscall-template.S:120)
==582489== by 0x109FE5: parse_cmd (mysh.c:318)
==582489== by 0x109C53: parse_cmd (mysh.c:228)
==582489== by 0x10A25E: main (mysh.c:388)
型
我犯了什么错误导致valgrind给予这个输出?
1条答案
按热度按时间7y4bm7vi1#
我们慢慢说吧。
系统调用(或系统调用)是用户代码对内核进行函数调用的方式。常见的系统调用有
open
、read
、write
、futex
。大约有400个系统调用。系统调用的参数。
用另一个可执行文件替换当前可执行文件的系统调用。
参数向量,这是将传递给新可执行文件的参数。
手册页上说
argv是传递给新程序的参数字符串数组。按照惯例,这些字符串中的第一个应该包含与正在执行的文件相关联的文件名。envp是一个字符串数组,通常是key=value的形式,它作为环境传递给新程序。argv和envp都必须以NULL指针结束。
(我加了粗体)。
某些内存尚未赋值。
你的
argv
是NULL
,或者更有可能的是,你忘记了NULL
终止指向char*
的指针数组,而char*
是由argv
组成的。