pg_diffix icon indicating copy to clipboard operation
pg_diffix copied to clipboard

Use offsetof for flexible struct allocation

Open edongashi opened this issue 3 years ago • 2 comments

We are doing allocation of structs with flexible array members wrong. It should be:

palloc( offsetof(MyStruct, last_member) + num_items * sizeof(ArrayMember) );

See https://github.com/postgres/postgres/blob/master/src/include/c.h#L342-L350.

The reason is that padding may give a different array start location compared to sizeof.

typedef struct MyStruct {
    double x;
    char y;
    int z[];
} MyStruct;

int main(void) {
    printf("sizeof: %lu\n", sizeof(MyStruct));
    printf("offsetof: %lu\n", offsetof(MyStruct, z));
}

The above prints:

sizeof: 16
offsetof: 12

edongashi avatar Jun 27 '22 16:06 edongashi

It doesn't look to me that we have a problem: sizeof(MyStruct) is always greater than or equal to offsetof(MyStruct, z), so, in the worst case, we just waste the padding bytes.

cristianberneanu avatar Jun 27 '22 18:06 cristianberneanu

You're right. For a moment I saw it the other way around. Nonetheless, it's a good small fix to have.

edongashi avatar Jun 27 '22 21:06 edongashi