Re: Expanding the use of FLEXIBLE_ARRAY_MEMBER for declarations like foo[1]

From: Michael Paquier <michael(dot)paquier(at)gmail(dot)com>
To: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
Cc: Andres Freund <andres(at)2ndquadrant(dot)com>, PostgreSQL mailing lists <pgsql-hackers(at)postgresql(dot)org>
Subject: Re: Expanding the use of FLEXIBLE_ARRAY_MEMBER for declarations like foo[1]
Date: 2015-02-19 07:46:58
Message-ID: CAB7nPqRfq+HMcanDjwnKjEnW_VUzVpao_d1E3uCbqRq5iuh1vQ@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

On Thu, Feb 19, 2015 at 3:57 PM, Michael Paquier
<michael(dot)paquier(at)gmail(dot)com> wrote:
> On Thu, Feb 19, 2015 at 2:58 PM, Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us> wrote:
>> Michael Paquier <michael(dot)paquier(at)gmail(dot)com> writes:
>>> 1-2) sizeof(ParamListInfoData) is present in a couple of places,
>>> assuming that sizeof(ParamListInfoData) has the equivalent of 1
>>> parameter, like prepare.c, functions.c, spi.c and postgres.c:
>>> - /* sizeof(ParamListInfoData) includes the first array element */
>>> paramLI = (ParamListInfo)
>>> palloc(sizeof(ParamListInfoData) +
>>> - (num_params - 1) * sizeof(ParamExternData));
>>> + num_params * sizeof(ParamExternData));
>>> 1-3) FuncCandidateList in namespace.c (thanks Andres!):
>>> newResult = (FuncCandidateList)
>>> - palloc(sizeof(struct _FuncCandidateList) - sizeof(Oid)
>>> - + effective_nargs * sizeof(Oid));
>>> + palloc(sizeof(struct _FuncCandidateList) +
>>> + effective_nargs * sizeof(Oid));
>>> I imagine that we do not want for those palloc calls to use ifdef
>>> FLEXIBLE_ARRAY_MEMBER to save some memory for code readability even if
>>> compiler does not support flexible-array length, right?
>>
>> These are just wrong. As a general rule, we do not want to *ever* take
>> sizeof() a struct that contains a flexible array: the results will not
>> be consistent across platforms. The right thing is to use offsetof()
>> instead. See the helpful comment autoconf provides:
>>
>> [...]
>
> And I had this one in front of my eyes a couple of hours ago... Thanks.
>
>> This point is actually the main reason we've not done this change long
>> since. People did not feel like running around to make sure there were
>> no overlooked uses of sizeof().
>
> Thanks for the clarifications and the review. Attached is a new set.

Grr. Completely forgot to use offsetof in dumputils.c as well. Patch
that can be applied on top of 0001 is attached.
--
Michael

Attachment Content-Type Size
dumputils-fix.patch application/x-patch 567 bytes

In response to

Browse pgsql-hackers by date

  From Date Subject
Next Message Dean Rasheed 2015-02-19 08:07:53 Re: Odd behavior of updatable security barrier views on foreign tables
Previous Message Shigeru Hanada 2015-02-19 07:19:07 Re: Join push-down support for foreign tables