Heap Overflow
Heap ใช้เก็บตัวแปรแบบไดนามิก (dynamic variables) เป็นพื้นที่หน่วยความจำของ process ฟังก์ชัน malloc(), calloc(), realloc() ใช้จองหน่วยความจำใน heap
Heap overflow เกิดขึ้นเมื่อ:
- ก) จองตัวแปรไดนามิกจำนวนมากเกินไป
int main() { float *ptr = (int *)malloc(sizeof(float)*1000000.0); } - ข) จองหน่วยความจำต่อเนื่องโดยไม่ free หลังใช้งาน
int main() { for (int i=0; i<100000000000; i++) { int *p = (int *)malloc(sizeof(int)); } }
Stack Overflow
Stack เป็นโครงสร้างข้อมูล LIFO ใช้เก็บตัวแปร local ภายในฟังก์ชัน พารามิเตอร์ และ return address หากโปรแกรมใช้หน่วยความจำเกินขนาด stack จะเกิด stack overflow
Stack overflow เกิดขึ้นเมื่อ:
- ก) เรียกฟังก์ชันแบบ recursive ไม่มีที่สิ้นสุด
void calculate(int a) { if (a == 0) return; a = 6; calculate(a); } int main() { int a = 5; calculate(a); } - ข) ประกาศตัวแปร local จำนวนมาก หรืออาเรย์ขนาดใหญ่
int main() { int A[20000][20000]; }