使用valgrind--leake-check=yes运行以下C程序会导致valgrind给出一条输出,指示"syscall param execve(Argv)指向未初始化的字节(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给出这样的输出?

推荐答案

让我们慢慢来看看这个.

  • 《系统呼叫》

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

  • "我的钱"

系统调用的参数.

  • "execve"

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

  • "Argv"-"Argv"

参数向量,它是将传递给新的可执行文件的参数.

手册页上说

Argv是传递给新程序的参数字符串array.通过 约定,这些字符串中的第一个应包含文件名 与正在执行的文件相关联.Envp是字符串数组, 通常形式为key=value,它们作为环境传递 为新计划干杯.Both argv and envp must be terminated by a NULL pointer.

(我加了粗体字).

  • "未初始化字节(S)"

某些内存尚未赋值.

您的argv可能是NULL,或者更有可能的是,您忘记了NULL终止组成argv的指向char*的指针array.

C++相关问答推荐

想了解 struct 指针和空指针转换

与unions 的未定义行为

我应该如何解决我自己为iOS编译的xmlsec1库的问题?转换Ctx.first在xmlSecTransformCtxPrepare()之后为空

如何创建一个C程序来存储5种动物的名字,并在用户 Select 其中任何一种动物时打印内存地址?

非常大的数组的大小

使用双指针动态分配和初始化2D数组

限制不同类型的限定符

X64:并发写入布尔数组

Kdb:仅升级指定的列

这个C程序在工作中途停止获取输入.我收到分段故障(核心转储).我还是不知道问题出在哪里

I2C外设在单次交易后出现故障

如何用C语言为CLI应用程序编写按键检测系统?

在C++中允许使用字符作为宏参数

我正在使用c学习数据 struct ,在学习堆栈时,我试图将中缀转换为后缀,并编写了这段代码.代码未给出输出

通过GTK';传递回调参数;s g_signal_connect()导致C中出现意外值

在C中交换字符串和数组的通用交换函数

C 和 C++ 标准如何告诉您如何处理它们未涵盖的情况?

Linux memcpy 限制关键字语法

无法在线程内用 C 打印?

c 函数指针,另一种语法