ToT glibc build problem with ToT GCC

Carlos O'Donell carlos@redhat.com
Fri Aug 30 12:25:00 GMT 2019


On 8/30/19 7:02 AM, Szabolcs Nagy wrote:
> On 29/08/2019 20:17, Carlos O'Donell wrote:
>> Is there a viable solution for a static allocation of a structure
>> that ends in a VLA?
> 
> flexible array member should be possible to allocate with a union:
> 
> static union
> {
>   struct { int nbytes; char bytes[N]; } xxx;
>   struct { int nbytes; char bytes[]; } replace;
> } u;
> 
> then u.replace has N extra bytes allocated (and initialized to 0).
> 
> (i think you can use u.xxx and u.replace interchangeably with
> a lax interpretation of the "common initial sequence" rule
> http://port70.net/~nsz/c/c11/n1570.html#6.5.2.3p6 )
> 
> if you don't want to repeat the struct type definition then
> 
> static union
> {
>   struct foo replace;
>   char xxx[sizeof(struct foo) + N];
> } u;

Right, this is the solution I was thinking about using.

> should work (but the tail bytes are not initialized with this
> ordering, the other ordering initializes u.xxx but you have
> to rely on type punning when accessing u.replace which is safe
> with gcc).
> 
> these should not trigger out-of-bounds warnings.

Does it avoid the interior zero-length array problem Martin was
saying was "iffy" from the compiler perspective?

I realize now that Martin kept 'struct charseq replace[2]' in his
example, which did mean that there was an "interior" zero-length
array after the first array element. We don't need to use 'replace[2]'
if we have a union and the total union size is large enough.

-- 
Cheers,
Carlos.



More information about the Libc-alpha mailing list