7 min read

OSTEP 14 Memory API

Table of Contents

1. ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์˜ ์ข…๋ฅ˜

C ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜๋ฉด, ๋‘ ๊ฐ€์ง€ ์œ ํ˜•์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์ด ํ• ๋‹น๋œ๋‹ค.

  • stack ๋ฉ”๋ชจ๋ฆฌ
    • ์ปดํŒŒ์ผ๋Ÿฌ์— ์˜ํ•ด ์•”๋ฌต์ ์œผ๋กœ ํ• ๋‹น๊ณผ ๋ฐ˜ํ™˜์ด ์ด๋ฃจ์–ด์ง
void func() {
    int x; // ์Šคํƒ์— int ํ˜•์„ ์„ ์–ธ
    // rest of code
}
  • heap ๋ฉ”๋ชจ๋ฆฌ
    • ๋ชจ๋“  ํ• ๋‹น๊ณผ ๋ฐ˜ํ™˜์ด ํ”„๋กœ๊ทธ๋ž˜๋จธ์— ์˜ํ•ด ๋ช…์‹œ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋จ
void func() {
	int *x = (int*) malloc(sizeof(int));
	// rest of code
}

ํ•œ ํ–‰์— ์Šคํƒ๊ณผ ํž™ ํ• ๋‹น์ด ๋ชจ๋‘ ๋ฐœ์ƒํ•œ๋‹ค.

  1. ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํฌ์ธํ„ฐ ๋ณ€์ˆ˜์˜ ์„ ์–ธ int *x ๋ฅผ ๋งŒ๋‚˜๋ฉด ์ •์ˆ˜ ํฌ์ธํ„ฐ๋ฅผ ์œ„ํ•œ ๊ณต๊ฐ„์„ ํ• ๋‹นํ•ด์•ผ ํ•œ๋‹ค.
  2. ํ”„๋กœ๊ทธ๋žจ์ด malloc() ์„ ํ˜ธ์ถœํ•˜์—ฌ ์ •์ˆ˜๋ฅผ ์œ„ํ•œ ๊ณต๊ฐ„์„ ํž™์œผ๋กœ๋ถ€ํ„ฐ ์š”๊ตฌํ•œ๋‹ค.
  3. ์„ฑ๊ณตํ•œ ๊ฒฝ์šฐ ๊ทธ ์ •์ˆ˜์˜ ์ฃผ์†Œ๋ฅผ ๋ฐ˜ํ™˜, ์‹คํŒจํ•œ ๊ฒฝ์šฐ NULL์„ ๋ฐ˜ํ™˜

2. malloc() ํ•จ์ˆ˜

ํž™์— ์š”์ฒญํ•  ๊ณต๊ฐ„์˜ ํฌ๊ธฐ๋ฅผ ๋„˜๊ฒจ ์ฃผ๋ฉด, ์„ฑ๊ณตํ–ˆ์„ ๊ฒฝ์šฐ ์ƒˆ๋กœ ํ• ๋‹น๋œ ๊ณต๊ฐ„์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฐ˜ํ™˜ํ•˜๊ณ , ์‹คํŒจํ–ˆ์„ ๊ฒฝ์šฐ NULL์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฐ„๋‹จํ•œ ํ•จ์ˆ˜. malloc() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด stdlib.h๋ฅผ include ํ•ด์•ผ ํ•œ๋‹ค.

malloc() ํ•จ์ˆ˜์˜ ์ธ์ž๋Š” size_t ํƒ€์ž…์ด๊ณ  ์ด ๋ณ€์ˆ˜๋Š” ํ•„์š” ๊ณต๊ฐ„์˜ ํฌ๊ธฐ๋ฅผ ๋ฐ”์ดํŠธ ๋‹จ์œ„๋กœ ํ‘œ์‹œํ•œ ๊ฒƒ์ด๋‹ค. ์ˆซ์ž๋ฅผ ์ง์ ‘ ์“ฐ์ง€ ์•Š๊ณ  sizeof() ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์“ด๋‹ค.

malloc() ํ•จ์ˆ˜๋Š” void ํƒ€์ž…์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ฃผ์†Œ๋งŒ ๋„˜๊ฒจ์ฃผ๊ณ  ํ•ด๋‹น ์ฃผ์†Œ์— ์–ด๋–ค ํƒ€์ž…์˜ ์ž๋ฃŒ๋ฅผ ์ €์žฅํ•  ์ง€๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ๊ฒฐ์ •ํ•˜๊ฒŒ ํ•˜๋Š” ์ „ํ˜•์ ์ธ C ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์ด๋‹ค.

3. free() ํ•จ์ˆ˜

๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ํž™ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•˜๊ธฐ ์œ„ํ•ด ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” free()๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

int *x = malloc(10 * sizeof(int));
// rest of code
free(x);

ํ•œ๊ฐœ์˜ ์ธ์ž malloc()์— ์˜ํ•ด ๋ฐ˜ํ™˜๋œ ํฌ์ธํ„ฐ๋ฅผ ๋ฐ›๋Š”๋‹ค. ํ• ๋‹น๋œ ์˜์—ญ์˜ ํฌ๊ธฐ๋Š” ์ „๋‹ฌ๋˜์ง€ ์•Š๋Š”๋‹ค. ๊ทธ ํฌ๊ธฐ๋Š” ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์ด ํฌ๊ธฐ๋ฅผ ์–ด๋–ป๊ฒŒ ์•Œ ์ˆ˜ ์žˆ์„๊นŒ?

malloc()์ด๋‚˜ calloc() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋™์  ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๋ฉด, ์‹ค์ œ๋กœ ์š”์ฒญ๋œ ํฌ๊ธฐ๋ณด๋‹ค ์•ฝ๊ฐ„ ๋” ๋งŽ์€ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ• ๋‹น๋ฉ๋‹ˆ๋‹ค. ์ด ์ถ”๊ฐ€๋œ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์—๋Š” ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ •๋ณด๊ฐ€ ์ €์žฅ๋˜๋ฉฐ, ์—ฌ๊ธฐ์—๋Š” ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ ๋ธ”๋ก์˜ ํฌ๊ธฐ, ์‚ฌ์šฉ ์—ฌ๋ถ€ ๋“ฑ์˜ ์ •๋ณด๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ธ”๋ก์ด ํ•ด์ œ๋˜์–ด์•ผ ํ•  ๋•Œ free() ํ•จ์ˆ˜๊ฐ€ ๋ช‡ ๋ฐ”์ดํŠธ์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•ด์•ผ ํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ด ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋Š” ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ ๋ธ”๋ก ๋ฐ”๋กœ ์•ž์— ์œ„์น˜ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

OSTEP 14 Memory API-1689612989858.jpeg

struct malloc_chunk {
  INTERNAL_SIZE_T      prev_size;  /* Size of previous chunk (if free).  */
  INTERNAL_SIZE_T      size;       /* Size in bytes, including overhead. */

  struct malloc_chunk* fd;         /* double links -- used only if free. */
  struct malloc_chunk* bk;

  /* Only used for large blocks: pointer to next larger size.  */
  struct malloc_chunk* fd_nextsize; /* double links -- used only if free. */
  struct malloc_chunk* bk_nextsize;
};

์ด ์ฝ”๋“œ๋Š” C ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์˜ malloc() ํ•จ์ˆ˜์—์„œ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์— ์‚ฌ์šฉ๋˜๋Š” ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์ธ malloc_chunk์˜ ์ •์˜์ž…๋‹ˆ๋‹ค. malloc_chunk๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ธ”๋ก์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ตฌ์กฐ์ฒด๋กœ, ๊ฐ ๋ฉ”๋ชจ๋ฆฌ ๋ธ”๋ก์˜ ์ƒํƒœ์™€ ๊ด€๋ จ๋œ ์ •๋ณด๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ์ฒด์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ •๋ณด๋“ค์ด ์ €์žฅ๋ฉ๋‹ˆ๋‹ค:

  • prev_size: ์ด ํ•„๋“œ๋Š” ํ˜„์žฌ ๋ธ”๋ก์ด ํ•ด์ œ๋œ ์ƒํƒœ๋ผ๋ฉด ๋ฐ”๋กœ ์•ž์— ์œ„์น˜ํ•œ ๋ธ”๋ก์˜ ํฌ๊ธฐ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ๋ธ”๋ก์ด ์‚ฌ์šฉ ์ค‘์ด๋ฉด ์ด ํ•„๋“œ๋Š” ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค.
  • size: ์ด ํ•„๋“œ๋Š” ํ˜„์žฌ ๋ฉ”๋ชจ๋ฆฌ ๋ธ”๋ก์˜ ์ „์ฒด ํฌ๊ธฐ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์ด ํฌ๊ธฐ์—๋Š” ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์˜ ํฌ๊ธฐ๋„ ํฌํ•จ๋˜๋ฉฐ, ๋˜ํ•œ ๋ธ”๋ก์˜ ํ• ๋‹น ์ƒํƒœ์— ๋Œ€ํ•œ ์ •๋ณด๋„ ํ•จ๊ป˜ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. (๋ณดํ†ต ๋งˆ์ง€๋ง‰ ๋น„ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ธ”๋ก์ด ์‚ฌ์šฉ ์ค‘์ธ์ง€ ์•„๋‹Œ์ง€๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค)
  • fd์™€ bk: ์ด๋“ค ํ•„๋“œ๋Š” ๋”๋ธ” ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ์˜ ํฌ์›Œ๋“œ(fd) ๋…ธ๋“œ์™€ ๋ฐฑ์›Œ๋“œ(bk) ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค. ์ด๋“ค์€ malloc_chunk๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์˜ ํ•ด์ œ ๋ฆฌ์ŠคํŠธ(free list)์— ์œ„์น˜ํ•œ ๊ฒฝ์šฐ์—๋งŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด ๋ฆฌ์ŠคํŠธ๋Š” ํ˜„์žฌ ์‚ฌ์šฉ๋˜์ง€ ์•Š๊ณ  ํ•ด์ œ๋œ ์ƒํƒœ์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ธ”๋ก๋“ค์„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • fd_nextsize์™€ bk_nextsize: ์ด๋“ค ํ•„๋“œ๋Š” ํฐ ๋ฉ”๋ชจ๋ฆฌ ๋ธ”๋ก์˜ ๊ฒฝ์šฐ์—๋งŒ ์‚ฌ์šฉ๋˜๋ฉฐ, ๋‹ค์Œ ํฌ๊ธฐ์˜ ๋” ํฐ ๋ฉ”๋ชจ๋ฆฌ ๋ธ”๋ก์„ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.

malloc() ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด, ๋ฉ”๋ชจ๋ฆฌ ๋ธ”๋ก ์ „์ฒด๊ฐ€ ํ• ๋‹น๋˜๊ณ  ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์˜์—ญ์—๋Š” ํ•ด๋‹น ๋ธ”๋ก์˜ ํฌ๊ธฐ ์ •๋ณด ๋“ฑ์ด ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ํ•จ์ˆ˜๋Š” ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋  ์˜์—ญ์˜ ์‹œ์ž‘ ์ฃผ์†Œ, ์ฆ‰ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๋ฐ”๋กœ ๋‹ค์Œ์˜ ์ฃผ์†Œ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด free() ํ•จ์ˆ˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ธ”๋ก์„ ํ•ด์ œํ•  ๋•Œ ํ•ด๋‹น ๋ธ”๋ก์˜ ํฌ๊ธฐ๋ฅผ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. free() ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด, ํ•ด๋‹น ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ๋ฐ›์•„๋“ค์ด๊ณ  ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์˜์—ญ์œผ๋กœ โ€œ๋’ค๋กœ ๊ฑธ์–ด๊ฐ€โ€ ๋ฉ”๋ชจ๋ฆฌ ๋ธ”๋ก์˜ ํฌ๊ธฐ๋ฅผ ํ™•์ธํ•œ ํ›„ ๊ทธ ํฌ๊ธฐ๋งŒํผ์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•ฉ๋‹ˆ๋‹ค.

4. ํ”ํ•œ ์˜ค๋ฅ˜

๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ์žŠ์–ด๋ฒ„๋ฆฌ๊ธฐ

char *src = "hello";
char *dst;
strcpy(dst, src); // ํ• ๋‹น์ด ๋˜์–ด ์žˆ์ง€ ์•Š์Œ. segfault.

Segmentation Fault๋Š” ํ”„๋กœ๊ทธ๋žจ์ด ์ž์‹ ์ด ์ ‘๊ทผ ๊ถŒํ•œ์ด ์—†๋Š” ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์— ์ ‘๊ทผํ•˜๋ ค๊ณ  ์‹œ๋„ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์˜ค๋ฅ˜. ์ž์„ธํ•œ ๋‚ด์šฉ์€ OSTEP 16 Segmentation์—์„œ ์•Œ์•„๋ณด์ž.

๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋ถ€์กฑํ•˜๊ฒŒ ํ• ๋‹น๋ฐ›๊ธฐ

char *src = "hello";
char *dst = malloc(strlen(src)); // ๋ถ€์กฑํ•˜๊ฒŒ ํ• ๋‹น
strcpy(dst, src);

Buffer Overflow. ๊ตฌํ˜„ ๋ฐฉ์‹์— ๋”ฐ๋ผ ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ• ์ˆ˜๋„ ์žˆ๋‹ค. ํ”„๋กœ๊ทธ๋žจ์ด ํ•œ ๋ฒˆ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์‹คํ–‰๋œ๋‹ค๊ณ  ํ•˜๋”๋ผ๊ณ , ํ”„๋กœ๊ทธ๋žจ์ด ์˜ฌ๋ฐ”๋ฅด๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜์ง€๋Š” ์•Š๋Š”๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•ด์•ผ ์˜ฌ๋ฐ”๋ฅธ ์ฝ”๋“œ๋‹ค.

char *src = "hello";
char *dst = malloc(strlen(src) + 1);
if (dst != NULL) {
    strcpy(dst, src);
}

ํ• ๋‹น๋ฐ›์€ ๋ฉ”๋ชจ๋ฆฌ ์ดˆ๊ธฐํ™”ํ•˜์ง€ ์•Š๊ธฐ

malloc()์„ ํ˜ธ์ถœํ•ด์„œ ์ƒˆ๋กœ ํ• ๋‹น๋ฐ›์€ ๋ฐ์ดํ„ฐ ํƒ€์ž…์— ๊ฐ’์„ ๋„ฃ์–ด์•ผ ํ•˜๋Š”๋ฐ ๊ทธ๋ƒฅ ์ฝ์œผ๋ฉด? ํž™์œผ๋กœ๋ถ€ํ„ฐ ์•Œ ์ˆ˜ ์—†๋Š” ๊ฐ’์„ ์ฝ๋Š” ์ผ(uninitialized read)์ด ์ƒ๊ธด๋‹ค.

๋ฉ”๋ชจ๋ฆฌ ํ•ด์ œํ•˜์ง€ ์•Š๊ธฐ

memory leak. ์žฅ์‹œ๊ฐ„ ์‹คํ–‰๋˜๋Š” ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด๋‚˜ ์šด์˜์ฒด์ œ ์ž์ฒด์™€ ๊ฐ™์€ ์‹œ์Šคํ…œ ํ”„๋กœ๊ทธ๋žจ์—์„œ ํฐ ๋ฌธ์ œ๋‹ค.

Garbage Collector๊ฐ€ ์žˆ์–ด๋„ ์ด ๋ฌธ์ œ๋ฅผ ํ”ผํ•ด๊ฐˆ ์ˆ˜ ์—†๋‹ค. ๋ฉ”๋ชจ๋ฆฌ ์ฒญํฌ์— ๋Œ€ํ•œ ์ฐธ์กฐ๊ฐ€ ์กด์žฌํ•˜๋ฉด, ์–ด๋А GC๋„ ๊ทธ ์ฒญํฌ๋ฅผ ํ•ด์ œํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋”ฐ๋ผ์„œ ํ˜„๋Œ€์ ์ธ ์–ธ์–ด์—์„œ๋„ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋Š” ์—ฌ์ „ํžˆ ๋ฌธ์ œ๊ฐ€ ๋œ๋‹ค.

ํ•œ ๋ฐ”์ดํŠธ๋ผ๋„ ๋ช…์‹œ์ ์œผ๋กœ ํ• ๋‹น๋ฐ›์•˜์œผ๋ฉด ํ•ด์ œํ•˜๋Š” ์Šต๊ด€์„ ๋“ค์ด๋„๋ก ํ•˜์ž.

๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์ด ๋๋‚˜๊ธฐ ์ „์— ๋ฉ”๋ชจ๋ฆฌ ํ•ด์ œํ•˜๊ธฐ

dangling pointer. ์‹ฌ๊ฐํ•œ ์‹ค์ˆ˜์ด๋‹ค. ์ฐจํ›„ ๊ทธ ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ”„๋กœ๊ทธ๋žจ์„ ํฌ๋ž˜์‹œ ์‹œํ‚ค๊ฑฐ๋‚˜ ์œ ํšจ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„ ๋ฎ์–ด์“ธ ์ˆ˜ ์žˆ๋‹ค. free()๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ๋‹ค๋ฅธ ์šฉ๋„๋กœ malloc()์„ ํ˜ธ์ถœํ•˜๋Š” ๊ฒฝ์šฐ, ์ž˜๋ชป ํ•ด์ œ๋œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค.

๋ฐ˜๋ณต์ ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ ํ•ด์ œํ•˜๊ธฐ

double free.

struct malloc_chunk* fd;         /* double links -- used only if free. */
struct malloc_chunk* bk;

chunk์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ผ๋ถ€์ด๋‹ค. ๋”๋ธ” ๋งํฌ๋“œ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐ ์“ฐ์ธ๋‹ค. ์ด ๋งํฌ๋“œ๋ฆฌ์ŠคํŠธ๋Š” free()๋œ ์ฒญํฌ๋“ค์„ ๋ชจ์•„๋†“๋Š” ๋ฆฌ์ŠคํŠธ์ด๋‹ค. ๋‹ค์Œ์— ๊ฐ™์€ ์‚ฌ์ด์ฆˆ์˜ ํ• ๋‹น์ด ๋  ๊ฒฝ์šฐ ๋น ๋ฅด๊ฒŒ ์žฌํ• ๋‹น ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค. double free๊ฐ€ ์ผ์–ด๋‚˜๋ฉด ์ด ๋งํฌ๋“œ๋ฆฌ์ŠคํŠธ์— ๊ฐ™์€ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๊ฐ€ ๋‘ ๋ฒˆ ๋“ค์–ด๊ฐ„๋‹ค. ํ”„๋กœ๊ทธ๋ž˜๋จธ์˜ ์˜๋„์™€๋Š” ๋‹ค๋ฅด๊ฒŒ, ๋ณ€์ˆ˜ ์—ฌ๋Ÿฌ ๊ฐœ๊ฐ€ ๊ฐ™์€ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ์ ์œ ํ•˜๊ฒŒ ๋˜์–ด ๋ฒ„๊ทธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

free() ์ž˜๋ชป ํ˜ธ์ถœํ•˜๊ธฐ

malloc() ๋ฐ›์€ ํฌ์ธํ„ฐ๋งŒ ์ „๋‹ฌํ•ด์•ผ ํ•œ๋‹ค. invalid frees๋Š” ๋งค์šฐ ์œ„ํ—˜ํ•˜๋‹ค(undefined behavior).

5. ์šด์˜์ฒด์ œ์˜ ์ง€์›

malloc()๊ณผ free()๋Š” ์‹œ์Šคํ…œ ์ฝœ์ด ์•„๋‹ˆ๋ผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ•จ์ˆ˜์ด๋‹ค. malloc()๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์‹œ์Šคํ…œ์—๊ฒŒ ๋” ๋งŽ์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์š”๊ตฌํ•˜๊ณ  ๋ฐ˜ํ™˜ํ•˜๋Š” ์‹œ์Šคํ…œ ์ฝœ(brk, sbrk)์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ์ถ•๋œ๋‹ค.

brk์™€ sbrk๋Š” ์šด์˜์ฒด์ œ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์‹œ์Šคํ…œ ํ˜ธ์ถœ์ž…๋‹ˆ๋‹ค. ์ด๋“ค์€ ํ”„๋กœ์„ธ์Šค์˜ ํž™ ์˜์—ญ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ์˜ ์–‘์„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. brk๋Š” ํ”„๋กœ๊ทธ๋žจ์˜ ํž™ ๋, ์ฆ‰ โ€œbreakโ€ ์œ„์น˜๋ฅผ ์„ค์ •ํ•˜๋Š” ์‹œ์Šคํ…œ ํ˜ธ์ถœ์ž…๋‹ˆ๋‹ค. brk์— ์ฃผ์–ด์ง„ ์ธ์ž๋Š” ํž™ ์˜์—ญ์˜ ์ƒˆ๋กœ์šด ๋์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฐ’์ด ํ˜„์žฌ break๋ณด๋‹ค ํฌ๋‹ค๋ฉด, ์šด์˜์ฒด์ œ๋Š” ํž™ ์˜์—ญ์„ ํ™•์žฅํ•˜๊ณ , ์ด ๊ฐ’์ด ํ˜„์žฌ break๋ณด๋‹ค ์ž‘๋‹ค๋ฉด, ์šด์˜์ฒด์ œ๋Š” ํž™ ์˜์—ญ์„ ์ถ•์†Œํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์‹œ ๋งํ•ด, brk๋Š” ์šด์˜์ฒด์ œ์—๊ฒŒ ํ”„๋กœ์„ธ์Šค์˜ ํž™ ์˜์—ญ ํฌ๊ธฐ๋ฅผ ์กฐ์ •ํ•˜๋„๋ก ์š”์ฒญํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. brk์™€ ๋น„์Šทํ•˜๊ฒŒ, sbrk๋„ ํž™ ์˜์—ญ์„ ๊ด€๋ฆฌํ•˜๋Š” ์‹œ์Šคํ…œ ํ˜ธ์ถœ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ sbrk๋Š” ์ƒˆ๋กœ์šด break ์œ„์น˜๋ฅผ ์ง์ ‘ ์ง€์ •ํ•˜๋Š” ๋Œ€์‹ , ํ˜„์žฌ break ์œ„์น˜์—์„œ์˜ ์ƒ๋Œ€์ ์ธ ๋ณ€ํ™”๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, sbrk์— ์ฃผ์–ด์ง„ ์ธ์ž๋Š” ํ˜„์žฌ break ์œ„์น˜์— ๋”ํ•ด์งˆ ํฌ๊ธฐ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์ด๋“ค ์‹œ์Šคํ…œ ํ˜ธ์ถœ์€ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(์˜ˆ๋ฅผ ๋“ค์–ด, malloc์™€ free)๊ฐ€ ์šด์˜์ฒด์ œ๋กœ๋ถ€ํ„ฐ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์š”์ฒญํ•˜๊ฑฐ๋‚˜ ๋ฐ˜ํ™˜ํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ผ๋ฐ˜์ ์œผ๋กœ๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์ง์ ‘ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. brk์™€ sbrk๋ฅผ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์ง์ ‘ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•˜๋ฉด, ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋‚ด๋ถ€ ์ƒํƒœ์™€ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ๋Œ€์‹  malloc๊ณผ free์™€ ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๊ณ  ํ•ด์ œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

mmap() ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์šด์˜์ฒด์ œ๋กœ๋ถ€ํ„ฐ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์–ป๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๋‹ค. ํŠน์ • ํŒŒ์ผ๊ณผ ์—ฐ๊ฒฐ๋˜์ง€ ์•Š์€ anonymous ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„ ์ƒ์„ฑํ•œ๋‹ค. swap space์— ์—ฐ๊ฒฐ๋˜๋ฉฐ, ํž™๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ์ทจ๊ธ‰๋˜๊ณ  ๊ด€๋ฆฌ๋œ๋‹ค.

6. ๊ธฐํƒ€ ํ•จ์ˆ˜๋“ค

calloc()

  • ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๊ณ  ์ด๋ฅผ 0์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜

realloc()

  • ์ด๋ฏธ ํ• ๋‹น๋œ ๊ณต๊ฐ„์— ์ถ”๊ฐ€์ ์ธ ๊ณต๊ฐ„์ด ํ•„์š”ํ•  ๋•Œ ์œ ์šฉํ•œ ํ•จ์ˆ˜
  • ๋” ํฐ ์ƒˆ๋กœ์šด ์˜์—ญ์„ ํ™•๋ณดํ•˜๊ณ , ์ด์ „ ์˜์—ญ์˜ ๋‚ด์šฉ์„ ๋ณต์‚ฌํ•œ ํ›„์— ์ƒˆ๋กœ์šด ์˜์—ญ์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.