2016-11-16 31 views
0

valgrind --leak-check=yes导致的valgrind给人一种输出指示获得“系统调用PARAM的execve(argv的)指向不可寻址字节(一个或多个)”在的valgrind

Syscall param execve(argv) points to unaddressable byte(s) 

该方案是如下运行以下C程序:

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

回答

2

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

如果没有空指针参数,exec函数将超出搜索终结符的范围,并将每个非空元素视为应传递给程序的参数。这导致未定义的行为

这在the exec manual page中清楚地指出。

相关问题