Cảnh báo này là cách của gcc cho bạn biết rằng nó không thể xác minh đối số chuỗi định dạng cho hàm kiểu printf (printf, fprintf ... v.v.). Cảnh báo này được tạo ra khi trình biên dịch không thể tự nhìn vào chuỗi và đảm bảo rằng mọi thứ sẽ diễn ra theo ý bạn trong suốt thời gian chạy. Hãy xem xét một vài ví dụ.
Trường hợp 1. Chuỗi này có thể được xác nhận tại thời gian biên dịch và trình biên dịch sẽ cho phép nó mà không có cảnh báo:
printf("This string has no format");
Trường hợp 2: Đối với trường hợp này, trình biên dịch có thể phát hiện rằng bạn có một định dạng specifier và sẽ nâng cao một cảnh báo khác nhau. Trên máy của tôi, nó nói "cảnh báo: quá ít đối số cho định dạng".
// This will most probably crash your machine
printf("Not a safe string to %s");
Trường hợp 3. Bây giờ điều này là hơi trường hợp của bạn. Bạn đang lấy một chuỗi được tạo ra khi chạy và cố in nó. Cảnh báo bạn nhận được là trình biên dịch cảnh báo bạn rằng có thể có một trình định dạng định dạng trong chuỗi. Nói ví dụ: "bad% sdata". Trong trường hợp này, thời gian chạy sẽ cố gắng truy cập một đối số không tồn tại để khớp với% s. Thậm chí tệ hơn, điều này có thể là một người dùng đang cố gắng khai thác chương trình của bạn (khiến nó đọc dữ liệu không an toàn để đọc).
char str[200];
scanf("%s", str)
printf(str)
Nguồn
2010-12-11 22:37:45
không 'imp' chứa gì? – casablanca
Điều gì sẽ xảy ra nếu bạn thay thế fprintf bằng 'fputs (imp, fil);'? – pmg
một chuỗi, cho phép giả sử một cái gì đó như thế này imp = "test"; – Unzi