전체 코드는 아래 더보기
더보기
/*
Properties of chunks recycled from fastbins
*/
static void
do_check_remalloced_chunk (mstate av, mchunkptr p, INTERNAL_SIZE_T s)
{
INTERNAL_SIZE_T sz = p->size & ~(PREV_INUSE | NON_MAIN_ARENA);
if (!chunk_is_mmapped (p))
{
assert (av == arena_for_chunk (p));
if (chunk_non_main_arena (p))
assert (av != &main_arena);
else
assert (av == &main_arena);
}
do_check_inuse_chunk (av, p);
/* Legal size ... */
assert ((sz & MALLOC_ALIGN_MASK) == 0);
assert ((unsigned long) (sz) >= MINSIZE);
/* ... and alignment */
assert (aligned_OK (chunk2mem (p)));
/* chunk is less than MINSIZE more than request */
assert ((long) (sz) - (long) (s) >= 0);
assert ((long) (sz) - (long) (s + MINSIZE) < 0);
}
재할당될 청크에 대한 검사를 하는 함수로 검사하는 항목은 아래와 같다
- p의 아레나가 현재 아레나와 동일한지 검사 ( IS_MMAPED 비트가 설정되지 않았을 경우 )
- do_check_inuse_chunk 호출 ( ...를 한다 )
- 사이즈가 정렬되있고 범위내에 존재하는 지 검사
- 재할당될 주소 정렬되어 있는지 검사
인자 및 변수
static void
do_check_remalloced_chunk (mstate av, mchunkptr p, INTERNAL_SIZE_T s)
{
INTERNAL_SIZE_T sz = p->size & ~(PREV_INUSE | NON_MAIN_ARENA);
...
- av : 현재 아레나
- p : 재할당될 freed chunk
- s : 요청된 chunk 사이즈
- sz : p->size (prev_inuse, non_main_arena 비트 제거 )
not mmapped
if (!chunk_is_mmapped (p))
{
assert (av == arena_for_chunk (p));
if (chunk_non_main_arena (p))
assert (av != &main_arena);
else
assert (av == &main_arena);
}
p가 mmap으로 할당되지 않으면 조건문을 수행한다
- p가 av 아레나에 있는지 검사
- p가 main아레나에 있고없고에 따라 av가 main아레나인지 아닌지 검사
check
do_check_inuse_chunk (av, p);
do_check_inuse_chunk에서 청크 p와 인접한 청크에 대한 검사를 수행한다
/* Legal size ... */
assert ((sz & MALLOC_ALIGN_MASK) == 0);
assert ((unsigned long) (sz) >= MINSIZE);
/* ... and alignment */
assert (aligned_OK (chunk2mem (p)));
/* chunk is less than MINSIZE more than request */
assert ((long) (sz) - (long) (s) >= 0);
assert ((long) (sz) - (long) (s + MINSIZE) < 0);
재할당될 p에 대한 검사를 한다
- 청크 p의 사이즈가 유효한지
- 헤더 크기를 제외한 p가 정렬 되어 있는지
- p의 size와 할당할 크기 비교
사용된 함수 및 매크로
do_check_inuse_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_free_chunk (0) | 2022.03.22 |
(glibc 2.23) do_check_chunk (0) | 2022.03.01 |
(glibc 2.23) do_check_inuse_chunk (0) | 2022.03.01 |