Tại sao trình biên dịch ANSI C không gắn cờ việc sử dụng đối số chuỗi ký tự trong một cuộc gọi hàm trong đó tham số correponding không có bộ định dạng const? Ví dụ, đoạn mã sau có thể tạo ra một ngoại lệ bằng cách cố gắng ghi vào bộ nhớ chỉ đọc.Chuỗi ký tự so với const char * trong C
void somefunc(char buffer[10]);
void somefunc(char buffer[10]) {
int i;
for (i = 0; i < 10; i++)
buffer[i] = 0;
}
int main(int argc, char **argv) {
somefunc("Literal");
return 0;
}
Tình trạng này có thể được xác định tại thời điểm biên dịch nhưng VS2010 và gcc không có vẻ như vậy. Gọi somefunc với một đối số const char * sẽ tạo ra một cảnh báo trình biên dịch.
Câu hỏi hay - gcc không bắt được điều này, ngay cả với '-Wextra'. –
Điểm tuyên bố một hàm là gì, sau đó xác định nó là dòng tiếp theo? :) – GManNickG
Hans: Tôi đã sửa đổi câu hỏi để chỉ định ANSI C. Dù sao, tôi đã không đề xuất một lỗi trình biên dịch được ban hành. Cảnh báo cấp độ 3 hoặc 4 sẽ chỉ làm nổi bật một tình huống nguy hiểm tiềm tàng. – Robin