2012-05-04 5 views
23

execvp được định nghĩa như sau:Tại sao tham số argv để execvp không const?

int execvp(const char *file, char *const argv[]); 

nào ngăn cản mã như này từ đang được sử dụng:

const char* argv[] = {"/bin/my", "command", "here", NULL}; 
execvp(argv[0], argv); 

Đây có phải là một thiếu sót vô tình? Có an toàn để const_cast xung quanh này? Hoặc thực hiện một số execvp thực hiện scribble trên bộ nhớ đó?

+3

Mặc dù gia đình chức năng 'exec *' không sửa đổi các đối số của nó như được ghi chú trong đặc tả POSIX, lưu ý rằng trên Windows, ['CreateProcess' yêu cầu dòng lệnh có thể ghi] (http://blogs.msdn.com /b/oldnewthing/archive/2009/06/01/9673254.aspx). –

Trả lời

7

Các spec POSIX nói (http://pubs.opengroup.org/onlinepubs/009604499/functions/exec.html):

Các argv[]envp[] mảng của con trỏ và chuỗi mà những điểm mảng sẽ không được sửa đổi bởi một cuộc gọi đến một trong những chức năng exec, trừ khi một hậu quả của việc thay thế hình ảnh quá trình.

Tôi nghĩ thiếu (hoặc bị thất lạc) const đơn giản là một sự kỳ quặc lịch sử.

+5

Thiếu 'const' không phải là một sự kỳ quặc lịch sử; thay vào đó, đó là vì bạn không thể chuyển đổi từ 'char **' thành 'const char * const *' trong C mà không có một phép diễn (nhưng bạn * có thể * trong C++). –

+2

@Adam: đúng. Đó là câu trả lời cho câu hỏi đầu tiên trong bài viết. Tôi cách nhau trên đó: http://c-faq.com/ansi/constmismatch.html –

+1

Xem thêm phần RATIONALE ở cuối thông số POSIX cho exec. Nó giải thích sự lựa chọn của sự thiếu sót const. –

-1

Tôi gặp phải tình huống tương tự này. Bởi vì execvp() có một thông số thứ hai là char *const, điều đó có nghĩa là nó chấp nhận một con trỏ liên tục đến một char. Vì vậy, nếu bạn vượt qua nó một con trỏ char nó sẽ có thể đúc con trỏ char đến một con trỏ liên tục đến một char. Vì vậy, thay vì tuyên bố nó

const char* argv[] = {"/bin/my", "command", "here", NULL}; 

thử

char* argv[] = {"/bin/my", "command", "here", NULL}; 

và nó sẽ chấp nhận argv[] mà không vấn đề.

+0

'Hằng số với một con trỏ char' là vô nghĩa. – EJP

+0

Tôi có nghĩa là con trỏ liên tục đến một char. Tôi đã đi trước và sửa lỗi sai ngữ pháp. –

+0

Điều đó chỉ di chuyển lỗi/cảnh báo từ dòng 'execvp()' sang câu lệnh gán (trừ khi bạn có một trình biên dịch rất khoan dung). –