This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: ToT glibc build problem with ToT GCC


On 8/29/19 2:36 PM, Martin Sebor wrote:
> On 8/29/19 11:54 AM, Carlos O'Donell wrote:
>> On 8/29/19 1:28 PM, Martin Sebor wrote:
>>> A longer term solution is to replace the array with a suitably
>>> aligned char buffer and write the data into it, e.g., like this:
>>>
>>>    union {
>>>      struct charseq replace[2];
>>>      char buf[sizeof (struct charseq) * 2];
>>>    } u;
>>>
>>>    u.replace[0].nbytes = 1;
>>>    const char s[] = "?";
>>>    memcpy (u.buf + offsetof (struct charseq, bytes), "?", 2);
>>>
>>> This is still iffy but it won't trigger an out-of-bounds warning.
>>> This code should still be flagged for the declaration of an object
>>> with an internal zero-length array, so that will need to be dealt
>>> with when such a warning is introduced (e.g., by suppressing
>>> the warning).
>>
>> Why is this iffy? This is the kind of solution I was thinking of using.
>>
>> The alternative is an entirely new type that has a non-zero-length
>> array that can be used for static object allocation like this, but then
>> you need to cast between them in a safe way?
> 
> It's iffy because of the interior zero-length array.

Is there only an interior zero-length array because you wrote replace[2]?

We don't need replace[2] if we have a union of enough bytes to hold a
single struct charseq.

-- 
Cheers,
Carlos.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]