전체 코드는 아래 더보기
더보기
/*
Properties of free chunks
*/
static void
do_check_free_chunk (mstate av, mchunkptr p)
{
INTERNAL_SIZE_T sz = p->size & ~(PREV_INUSE | NON_MAIN_ARENA);
mchunkptr next = chunk_at_offset (p, sz);
do_check_chunk (av, p);
/* Chunk must claim to be free ... */
assert (!inuse (p));
assert (!chunk_is_mmapped (p));
/* Unless a special marker, must have OK fields */
if ((unsigned long) (sz) >= MINSIZE)
{
assert ((sz & MALLOC_ALIGN_MASK) == 0);
assert (aligned_OK (chunk2mem (p)));
/* ... matching footer field */
assert (next->prev_size == sz);
/* ... and is fully consolidated */
assert (prev_inuse (p));
assert (next == av->top || inuse (next));
/* ... and has minimally sane links */
assert (p->fd->bk == p);
assert (p->bk->fd == p);
}
else /* markers are always of size SIZE_SZ */
assert (sz == SIZE_SZ);
}
INTERNAL_SIZE_T sz = p->size & ~(PREV_INUSE | NON_MAIN_ARENA);
mchunkptr next = chunk_at_offset (p, sz);
do_check_chunk (av, p);
필요한 변수 sz와 next를 선언한 뒤 do_check_chunk를 통해 검사를 수행한다
- sz : 청크 p의 사이즈
- next: 청크 p의 다음 청크
/* Chunk must claim to be free ... */
assert (!inuse (p));
assert (!chunk_is_mmapped (p));
청크 p가 free되었고 mmap으로 할당되지 않았는지 검사한다
/* Unless a special marker, must have OK fields */
if ((unsigned long) (sz) >= MINSIZE)
{
assert ((sz & MALLOC_ALIGN_MASK) == 0);
assert (aligned_OK (chunk2mem (p)));
/* ... matching footer field */
assert (next->prev_size == sz);
/* ... and is fully consolidated */
assert (prev_inuse (p));
assert (next == av->top || inuse (next));
/* ... and has minimally sane links */
assert (p->fd->bk == p);
assert (p->bk->fd == p);
}
else /* markers are always of size SIZE_SZ */
assert (sz == SIZE_SZ)
p와 p의 size에 대한 검사를 수행한다
사용된 함수 및 매크로
do_check_chunk 참고글
'Heap analysis > glibc 2.23' 카테고리의 다른 글
(glibc 2.23)check_malloced_chunk (0) | 2022.03.30 |
---|---|
(glibc 2.23) free (0) | 2022.03.23 |
(glibc 2.23) do_check_chunk (0) | 2022.03.01 |
(glibc 2.23) do_check_inuse_chunk (0) | 2022.03.01 |
(glibc 2.23) check_remalloced_chunk (0) | 2022.03.01 |