Skip to content

Use offsetof for flexible struct allocation #390

Open

Description

@edongashi

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

Activity

  1. cristianberneanu commented on Jun 27, 2022

    @cristianberneanu
    Collaborator

    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.

  2. edongashi commented on Jun 27, 2022

    @edongashi
    MemberAuthor

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions