2016-11-16 21 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中清楚地指出。

相關問題