Vì vậy, ở đây tôi tin rằng tôi có một vấn đề tràn bộ đệm nhỏ mà tôi đã tìm thấy khi xem xét mã của người khác. Nó ngay lập tức đánh tôi như là không chính xác, và có khả năng nguy hiểm, nhưng phải thừa nhận rằng tôi không thể giải thích những hậu quả thực tế của "sai lầm" này, nếu có.Hậu quả của lỗi tràn bộ đệm này?
Tôi đã viết một ứng dụng thử nghiệm để chứng minh lỗi, nhưng tìm thấy (để mất tinh thần của tôi) rằng nó có vẻ chạy đúng bất kể tràn. Tôi muốn tin rằng đây chỉ là tình cờ, nhưng muốn có một số phản hồi để xác định xem suy nghĩ của tôi có sai hay không, nếu thực sự có vấn đề ở đây thì không thể hiện đầu trong ứng dụng thử nghiệm của tôi.
Mã vấn đề (Tôi nghĩ rằng đó là, dù sao):
char* buffer = new char[strlen("This string is 27 char long" + 1)];
sprintf(buffer, "This string is 27 char long");
Bây giờ, lý do này đứng ra cho tôi và tôi muốn gắn cờ nó như là một lỗi tràn bộ đệm có thể là vì sự strlen
đầu tiên. Do số học con trỏ, vị trí 'không chính xác' của + 1
sẽ làm cho strlen
trả lại 26
thay vì 27
(lấy độ dài "chuỗi của anh ấy dài 27 char"). sprintf
, tôi tin rằng, sau đó in 27 char vào bộ đệm và đã gây ra một tràn bộ đệm.
Đó có phải là đánh giá chính xác không?
Tôi đã viết một ứng dụng thử nghiệm để chứng minh điều này cho người mà tôi đang xem mã và thấy rằng ngay cả trong trình gỡ lỗi chuỗi sẽ in chính xác. Tôi cũng cố gắng đặt các biến khác trên ngăn xếp và đống trước và sau mã này để xem liệu tôi có thể ảnh hưởng đến các vùng lân cận của bộ nhớ, nhưng vẫn nhận được kết quả chính xác. Tôi nhận ra rằng bộ nhớ heap mới được phân bổ của tôi có thể không liền kề, điều này sẽ giải thích sự thiếu tràn hữu ích, nhưng tôi thực sự muốn xác nhận với ý kiến của người khác nếu đây thực sự là một vấn đề.
Vì đây là một "câu hỏi" khá đơn giản, nó sẽ rất tuyệt nếu bạn có thể hỗ trợ câu trả lời của bạn với một số loại tham chiếu. Trong khi tôi đánh giá cao và chào đón đầu vào của bạn, tôi sẽ không chấp nhận "có nó là" như là câu trả lời cuối cùng. Cảm ơn bạn trước.
Cập nhật: Nhiều câu trả lời tốt với rất nhiều cái nhìn sâu sắc thêm. Thật không may, tôi không thể chấp nhận tất cả. Cảm ơn bạn đã chia sẻ kiến thức của mình và là 'ý kiến thứ hai' của tôi. Tôi đánh giá cao sự giúp đỡ.
Bạn có thể không bị cắn mã ở trên do đệm/căn chỉnh. Bạn có thể lặp lại các thử nghiệm của mình bằng chuỗi dài 64 ký tự, vì vậy phân bổ sẽ cần phải có 65 ký tự không? Và phân bổ hai chuỗi như vậy trước 'sprintf', điền chúng theo các thứ tự khác nhau. –
Đó là mã khá khó chịu để lấy chuỗi thô và thêm +1 vào đó! Tôi sẽ đánh rơi việc xem xét mã chỉ trên thực tế đó một mình. –
Và đây là lý do tại sao chúng tôi phát triển sử dụng nhiều thư viện được kiểm tra tốt nhất có thể ... bởi vì chúng tôi đã phạm sai lầm ngớ ngẩn như thế này! :-) @Johnson Tôi khá chắc chắn rằng các nhà phát triển có nghĩa là để thêm 1 đến chiều dài, không phải là chuỗi chính nó, do đó các lỗi. – corsiKa