Ví dụ đơn giản trong câu hỏi, có thể không có nhiều khác biệt về bảo mật giữa hai cuộc gọi. Tuy nhiên, trong trường hợp chung, snprintf()
có thể an toàn hơn. Khi bạn có chuỗi định dạng phức tạp hơn với nhiều thông số chuyển đổi, có thể khó (hoặc gần không thể) để đảm bảo rằng bạn có chiều dài bộ đệm được tính chính xác trên các chuyển đổi khác nhau - đặc biệt là do chuyển đổi trước đó không nhất thiết tạo ra số cố định các ký tự đầu ra.
Vì vậy, tôi muốn gắn bó với snprintf()
.
Một lợi thế nhỏ khác là snprintf()
(mặc dù không liên quan đến bảo mật) là nó sẽ cho bạn biết dung lượng bộ đệm bạn cần.
Một lưu ý cuối cùng - bạn nên xác định kích thước bộ đệm thực tế trong snprintf()
cuộc gọi - nó sẽ xử lý chiếm terminator null cho bạn:
snprintf(buff, sizeof(buff), "%s", name);
Nguồn
2011-09-06 07:42:35
Thay đổi # 2 thành 'MAXLEN + 1' và chúng sẽ giống hệt với những gì chúng viết vào' buff' trong mọi trường hợp (giá trị trả về sẽ khác nếu 'strlen (name)> 255'). –