Các chương trình sau đây khiêu khích lỗi segmentation có hệ thống do hành vi undefined (cố gắng để sửa đổi một chuỗi chữ):Tại sao không trình biên dịch C cảnh báo về các loại không tương thích với chuỗi ký tự?
int main() {
char *s = "immutable";
s[0] = 'a';
return 0;
}
Tuy nhiên, có vẻ là hoàn toàn không có cách nào để nói GCC/Clang phát ra thậm chí cảnh báo nhỏ về nó (-Wall -Wextra -pedantic -std=c11
không làm gì cả).
Đặc biệt đối với người mới bắt đầu, loại tình huống này sẽ hữu ích khi thông báo. Ngay cả đối với người mới bắt đầu không, trong một số tình huống hơi ít rõ ràng nó có thể hữu ích:
void f(char *s) {
s[0] = '0';
}
int main() {
char *s = "immutable";
f("literal"); // oops
f(s); // oops
return 0;
}
Bên cạnh đó, điều này sẽ giúp thực thi một số const
-culture trong lập trình C.
Tại sao các trường hợp này được bỏ qua cố ý? Liệu tiêu chuẩn này có chủ động nghiêm cấm việc chẩn đoán được phát ra trong các trường hợp như vậy hay chủ yếu là khả năng tương thích ngược (cố gắng thực thi chúng ngay bây giờ sẽ tạo ra quá nhiều cảnh báo)?
Nó không được bật theo mặc định bởi vì thật đáng buồn vẫn còn rất nhiều mã cũ được viết theo cách không đúng. Một số thậm chí trước khi thêm 'const' vào C. – StoryTeller
Bật cảnh báo như vậy theo mặc định sẽ dẫn đến báo động mệt mỏi. Nó sẽ được tốt đẹp để có trình biên dịch cảnh báo cho điều này, nhưng có quá nhiều mã cũ mà sẽ đi qua này trong khi vẫn đang được mã chính xác. – Art