3033
3034 #if !INSECURE
3035 #if defined(__GNUC__) && __GNUC__ >= 3
3036 #define RTCHECK(e) __builtin_expect(e, 1)
3037 #else
3038 #define RTCHECK(e) (e)
3039 #endif
3040 #else
3041 #define RTCHECK(e) (1)
3042 #endif
__builtin_expectの効力 - 初学者の箸置
3009 #if !INSECURE
3010
3011 #define ok_address(M, a) ((char*)(a) >= (M)->least_addr)
3012
3013 #define ok_next(p, n) ((char*)(p) < (char*)(n))
3014
3015 #define ok_inuse(p) is_inuse(p)
3016
3017 #define ok_pinuse(p) pinuse(p)
3018
3019 #else
3020 #define ok_address(M, a) (1)
3021 #define ok_next(b, n) (1)
3022 #define ok_inuse(p) (1)
3023 #define ok_pinuse(p) (1)
3024 #endif
2259 #define is_inuse(p) (((p)->head & INUSE_BITS) != PINUSE_BIT)
4702
4703
4704 void dlfree(void* mem) {
4705
4710
4711 if (mem != 0) {
4712 mchunkptr p = mem2chunk(mem);
4713 #if FOOTERS
4714 mstate fm = get_mstate_for(p);
4715 if (!ok_magic(fm)) {
4716 USAGE_ERROR_ACTION(fm, p);
4717 return;
4718 }
4719 #else
4720 #define fm gm
4721 #endif
4722 if (!PREACTION(fm)) {
4723 check_inuse_chunk(fm, p);
> 4724 if (RTCHECK(ok_address(fm, p) && ok_inuse(p))) { <=======================
4725 size_t psize = chunksize(p);
4726 mchunkptr next = chunk_plus_offset(p, psize);
4727 if (!pinuse(p)) {
4728 size_t prevsize = p->prev_foot;
4729 if (is_mmapped(p)) {
4730 psize += prevsize + MMAP_FOOT_PAD;
4731 if (CALL_MUNMAP((char*)p - prevsize, psize) == 0)
4732 fm->footprint -= psize;
4733 goto postaction;
4734 }