使用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给出这个输出?
实参列表必须以NULL
指针结束。向run_arguments
数组中添加一个元素,并使其为NULL
指针。
如果没有空指针参数,exec
函数在搜索终止符时会越界,并将每个非空元素视为应该传递给程序的参数。这会导致未定义行为。
这在exec
手册页中有明确的说明。