Tôi có đoạn mã C sau đây và phải xác định lỗi và gợi ý một cách để viết nó một cách an toàn hơn:Làm thế nào đoạn C này có thể được viết một cách an toàn hơn?
char somestring[] = "Send money!\n";
char *copy;
copy = (char *) malloc(strlen(somestring));
strcpy(copy, somestring);
printf(copy);
Vì vậy, lỗi là strlen mà bỏ qua các dấu '\0'
của một chuỗi và do đó nó không phải là sẽ được phân bổ đủ bộ nhớ cho bản sao nhưng tôi không chắc chắn những gì họ đang nhận được về viết nó an toàn hơn?
Tôi chỉ có thể sử dụng malloc(strlen(somestring)+1))
Tôi giả sử nhưng tôi nghĩ rằng phải có một cách tốt hơn?
EDIT: OK, tôi đã chấp nhận một câu trả lời, tôi nghi ngờ rằng giải pháp strdup sẽ không được mong đợi từ chúng tôi vì nó không phải là một phần của ANSI C. Nó có vẻ là khá một câu hỏi chủ quan vì vậy tôi 'không chắc chắn nếu những gì tôi đã chấp nhận thực sự là tốt nhất. Cảm ơn anyway cho tất cả các câu trả lời.
+1 để sử dụng strncpy. Đó là nguồn của rất nhiều lỗ hổng bảo mật, nó không phải là buồn cười. –
Sử dụng strncpy() tệ hơn là sử dụng strcpy() kém. Nếu bạn sử dụng strncpy(), bạn * NOT * được bảo đảm kết thúc đầu ra null (ví dụ này là OK, nhưng không nói chung). Ngoài ra, nếu bạn sử dụng bộ đệm quá khổ và sizeof (bộ đệm) cho tham số thứ ba tới strncpy(), bạn có một thảm họa hiệu suất nhỏ trên tay; strncpy() zealously zero-miếng đệm dữ liệu sao chép đến chiều dài đầy đủ. * CÓ * để biết độ dài của chuỗi nguồn và đích; nếu bạn làm điều đó một cách chính xác, sử dụng strcpy() là an toàn và an toàn hơn so với sử dụng mù của strncpy(). (Nếu nó là bất kỳ giúp đỡ, strncat() là xa, đến nay tồi tệ hơn so với strncpy(); không bao giờ sử dụng nó!) –
Jonathan, strlcpy() là nhiều hơn nữa sane. Tôi sử dụng nó bất cứ khi nào nó có sẵn, và đôi khi tôi mang theo một phiên bản khi nó không. Drepper quá tệ là một dork. – dwc