Tràn Heap (Heap Overflow)
Heap dùng lưu biến động. Là vùng bộ nhớ của tiến trình. malloc(), calloc(), realloc() thường dùng để cấp phát biến động.
Tràn heap xảy ra khi:
A) Cấp phát số lượng lớn biến động:
int main() {
float *ptr = (int *)malloc(sizeof(float)*1000000.0));
}B) Liên tục cấp phát bộ nhớ mà không giải phóng sau dùng:
int main() {
for (int i=0; i<100000000000; i++) {
int *p = (int *)malloc(sizeof(int));
}
}Tràn Stack (Stack Overflow)
Stack là cấu trúc dữ liệu LIFO (Last in First out). Dùng lưu biến cục bộ trong hàm. Tham số truyền qua hàm và địa chỉ trả về.
Nếu chương trình tiêu thụ nhiều bộ nhớ, tràn stack sẽ xảy ra do kích thước stack giới hạn.
Tràn stack xảy ra khi:
C) Hàm gọi đệ quy chính nó vô tận lần, stack không lưu được nhiều biến cục bộ:
void calculate(int a) {
if (a == 0)
return;
a = 6;
calculate(a);
}
int main() {
int a = 5;
calculate(a);
}D) Khai báo số lượng lớn biến cục bộ hoặc mảng/ma trận kích thước lớn:
int main() {
A[20000][20000]
}