2014-10-08 17 views
12

Tôi biết lỗi tràn bộ đệm là gì. Tôi không có ý tưởng tuy nhiên những gì một bộ đệm tràn là.C: Một ví dụ về tràn bộ đệm là gì?

Tôi đoán đó là khi một bộ đệm cụ thể nhận thay vì tràn byte, một dòng byte.

char buffer[8]; 
fgets(buffer, sizeof(buffer), stdin); 

Ở trên sẽ không có lỗi.

char buffer_overflow[8]; 
fgets(buffer_overflow, 16, stdin); 

ở trên sẽ cho kết quả trong một tràn đệm nếu người dùng nhập vào là, ví dụ như "deutschland".

Tôi có thể lấy ví dụ về mã không, đoạn mã đệm là gì?

+1

một số người giảm con trỏ của họ, thay vì tăng, lên đến một điểm, underflow có thể xảy ra. gần giống như tràn. – HuStmpHrrr

Trả lời

17

Luồng bộ đệm không liên quan trực tiếp đến tràn bộ đệm. Tuy nhiên, lưu lượng bộ đệm có thể là vấn đề với ví dụ: vòng đệm.

Cân nhắc phát lại âm thanh ví dụ: bộ đệm âm thanh của bạn có thể là bộ đệm vòng ở đâu đó trong bộ nhớ hạt nhân. Nếu bạn viết dữ liệu chậm hơn so với trình điều khiển âm thanh/phần cứng đọc từ bộ đệm, bộ đệm sẽ trống ("phần dưới"), dẫn đến âm thanh nói lắp. Các vấn đề tương tự tồn tại đối với các loại xử lý dữ liệu thời gian thực và phát lại phương tiện truyền thông thời gian thực khác. Do đó, tràn bộ đệm thường không phải là tình trạng lỗi trên mỗi lần (không giống như tràn bộ đệm, thường gây ra các chương trình để thực hiện các hành vi không xác định, không mong muốn như chấm dứt, thực thi một số mã không mong muốn và vv ..). NGUYÊN NHÂN

+2

Nếu tràn bộ đệm "thường" các chương trình bị chấm dứt, một nửa số vấn đề bảo mật trong hệ thống máy tính sẽ không tồn tại. – EOF

+0

đã chỉnh sửa câu trả lời – dom0

+0

"Dọn dẹp bộ đệm" là thuật ngữ phổ biến hơn, tôi nghĩ vậy. –

4

Tôi thỉnh thoảng nghe thuật ngữ này được sử dụng để chỉ sai đọc trước khi bắt đầu bộ đệm. Tôi không biết liệu từ này có phải là “đúng” không.

Ví dụ, hãy xem xét việc triển khai thiếu sót này.

struct fixed_size_stack 
{ 
    int top; 
    int data[128]; 
}; 

int 
fixed_size_stack_pop(struct fixed_size_stack * this) 
{ 
    return this->data[--(this->top)]; 
} 

Vui lòng cung thiếu cho if (this->top > 0) sẽ gây ra các chức năng để đọc qua các giới hạn thấp hơn của mảng nếu một cửa sổ pop từ một ngăn xếp đã có sản phẩm nào được yêu cầu.

-3

Tôi biết đã quá muộn để trả lời câu hỏi này ngay bây giờ. Tất cả các câu trả lời trước là thỏa đáng, tôi chỉ nghĩ rằng một ví dụ sẽ có ý nghĩa tốt hơn.

#include<stdio.h> 
int main(){ 
    unsigned int u=-1; 
    printf("%u",u); 
    return 0; 
} 

Output: 4294967295 

Đây là ví dụ đơn giản về bộ đệm vòng đệm. Chúng ta biết rằng int không dấu không thể biểu diễn các giá trị âm. Tuy nhiên, nếu chúng tôi chỉ định một -1 đến u, giá trị trong u hiện là 4294967295. Đây là 2^32 -1, giá trị cao nhất là unsigned int có thể lưu trữ. Lưu trữ giá trị thấp hơn sản lượng thấp nhất mà bạn có giá trị cao nhất. Đây là dòng chảy. Hi vọng điêu nay co ich.

+2

điều này không đúng. Ví dụ của bạn là tràn số nguyên. Và như một lưu ý phụ, bởi vì nó xảy ra trên dữ liệu chưa ký được xác định rõ. – bolov

0

Có một số ví dụ trong PVS V512. Tôi có vấn đề này trong gearmad thực hiện trong đoạn:

pollfd fds[2]; 
    ... 
    memset(fds, 0, sizeof(pollfd)); 
Các vấn đề liên quan