Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม C

Heap Overflow และ Stack Overflow ใน C


Heap Overflow

Heap ใช้เก็บ dynamic variables เป็น region ของ process's memory malloc(), calloc(), resize() ใช้เก็บ dynamic variables

Heap overflow เกิดเมื่อ:

A) จัดสรร dynamic variables จำนวนมาก:

int main() {    float *ptr = (int *)malloc(sizeof(float)*1000000.0)); }

B) จัดสรรหน่วยความจำต่อเนื่องและไม่ free หลังใช้:

int main() {    for (int i=0; i<100000000000; i++) {       int *p = (int *)malloc(sizeof(int)); } }

Stack Overflow

Stack เป็น Last in First out data structure ใช้เก็บ local variables ภายในฟังก์ชัน พารามิเตอร์และ return addresses ผ่าน stack นี้

ถ้าโปรแกรมใช้หน่วยความจำมากเกินไป Stack overflow จะเกิดขึ้นเพราะ stack size จำกัด

Stack overflow เกิดเมื่อ:

C) ฟังก์ชันถูกเรียก recursively โดยตัวเอง infinite times stack จะเก็บ local variables จำนวนมากไม่ได้:

void calculate(int a) {    if (a== 0)       return;       a = 6;       calculate(a); } int main() {    int a = 5;    calculate(a); }

D) ประกาศ local variables จำนวนมาก หรือ array/matrix ขนาดใหญ่:

int main() {    A[20000][20000] }