Page 1 of 1

[SOLVED Strange addition in C++/GCC

Posted: Sat Jan 20, 2018 11:30 pm
by Tutul
Hi there,

I'm using a struct to define a memory area like so:

Code: Select all

typedef struct {
    size_t size; // The size of the memory area
    int magic; // Used to detect block header corruption
    bool free; // The area is free ?
} block;
Each block is directly followed by the area of size block->size, and after it, we've got the next block.

To find the next block I just need to do p + p->size + sizeof(block) (p is a pointer to a block) yea ?
But I've got strange result :/
With p=0x106c74, p->size=0xff4 and sizeof(block)=0xc I should got 0x107c74 (as 0x106c74 + 0xff4 + 0xc = 0x106c74 + 0x1000). But when testing with GDB I've got 0x112c74 :/

Any idea ? GCC optimization are disabled. Did I miss something with c++ math ?

Re: Strange addition in C++/GCC

Posted: Sun Jan 21, 2018 12:15 am
by bluemoon
c++ pointer arithmetic acknowledge the pointer type, if p is pointer to a block type, p + p->size means &p[p->size].

so, with sizeof(block) = 12 (32-bits, with padding)

Code: Select all

p + p->size + sizeof(block)
= &p[p->size + sizeof(block)] 
= 0x106c74 + (0xff4 + 0xc) * 12
= 0x106c74 + 0xc000
= 0x112c74

Re: Strange addition in C++/GCC

Posted: Sun Jan 21, 2018 1:08 am
by Tutul
Oh I feel so stupid right now, didn't think about that. Thanks