Tin học
Bạn có muốn phản ứng với tin nhắn này? Vui lòng đăng ký diễn đàn trong một vài cú nhấp chuột hoặc đăng nhập để tiếp tục.

Bộ đệm là gì? Lỗi tràn bộ đệm là gì?

Go down

Bộ đệm là gì? Lỗi tràn bộ đệm là gì? Empty Bộ đệm là gì? Lỗi tràn bộ đệm là gì?

Bài gửi  Nguyen_Cao_Tri_(I92C) 26/10/2010, 15:08

Bộ đệm là gì? Lỗi tràn bộ đệm là gì?
A. Bộ đệm (BUFFER) hay bộ nhớ đệm là vùng nhớ tạm trong khi chờ đến lượt vì CPU và các thiết bị khác không làm việc cùng tốc độ, HDH thì xử lý các tiến trình có chia thời gian. Do đó cần có bộ đệm để chứa tạm thời. Bộ đệm hoạt động theo cơ chế FIFO.
VD: 1. Khi ghi dữ liệu lên ổ cứng hoặc đọc dữ liệu từ ổ cứng cũng cần Buffer.
2. Khi hai máy tính truyền dữ liệu cũng cần Buffer…
B. Lỗi tràn bộ đệm là một điều kiện bất thường khi một tiến trình lưu dữ liệu vượt ra ngoài biên của một bộ nhớ đệm có chiều dài cố định. Kết quả là dữ liệu đó sẽ đè lên các vị trí bộ nhớ liền kề. Dữ liệu bị ghi đè có thể bao gồm các bộ nhớ đệm khác, các biến và dữ liệu điều khiển luồng chạy của chương trình (program flow control).
/* CODE C - overflow.c - demonstrates a buffer overflow */

#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[])
{
char buffer[10];
if (argc < 2)
{
fprintf(stderr, "USAGE: %s string\n", argv[0]);
return 1;
}
strcpy(buffer, argv[1]);
return 0;
}
Trong ví dụ sau, "X" là dữ liệu đã từng nằm tại stack khi chương trình bắt đầu thực thi; sau đó chương trình gọi hàm "Y", hàm này đòi hỏi một lượng nhỏ bộ nhớ cho riêng mình; và sau đó "Y" gọi hàm "Z", "Z" đòi hỏi một bộ nhớ đệm lớn:
Z Z Z Z Z Z Y X X X
_________ : / / /
Nếu hàm "Z" gây tràn bộ nhớ đệm, nó có thể ghi đè dữ liệu thuộc về hàm Y hay chương trình chính:
Z Z Z Z Z Z Y X X X
._._._._._._._. / /

Chương trình trên được sửa lại để chống lội tràn bộ đệm.
/* better.c - demonstrates one method of fixing the problem */

#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[])
{
char buffer[10];
if (argc < 2)
{
fprintf(stderr, "USAGE: %s string\n", argv[0]);
return 1;
}
strncpy(buffer, argv[1], sizeof(buffer));
buffer[sizeof(buffer) - 1] = '\0';
return 0;
}


(suu tam)

Nguyen_Cao_Tri_(I92C)

Tổng số bài gửi : 58
Join date : 21/09/2010

Về Đầu Trang Go down

Về Đầu Trang

- Similar topics

 
Permissions in this forum:
Bạn không có quyền trả lời bài viết