On 12/12/2017 08:47 PM, Martin Sebor wrote:
>>
>> struct fu {
>> char x1[10];
>> char x2[10];
>> int avoid_trailing_array;
>> }
>>
>> Where objects stored in x1 are not null terminated. Are we in the realm
>> of undefined behavior at that point (I hope so)?
>
> Yes, this is undefined. Pointer arithmetic (either direct or
> via standard library functions) is only defined for pointers
> to the same object or subobject. So even something like
That's what I expected -- I just wanted to be sure there wasn't some
kind of escape clause that would allow one to compose an object of that
nature, then use pfu->x1 to read/write pfu->x2.
>
> memcpy (pfu->x1, pfu->x1 + 10, 10);
>
> is undefined. _FORTIFY_SOURCE allows it for raw memory functions
> because some low level code copies regions of the same object that
> span two or more members (I've seen an example or two in the Linux
> kernel but, IIRC, nowhere else). With the patch, using memchr
> would be the only way to get away with it.
Presumably the right way to go about things in this situation is to use
a pointer to the outer object.
>
> Other than that, the new -Wstringop-truncation warning is designed
> to prevent creating unterminated character arrays and the manual
> suggests using attribute nonstring when it's necessary. The
> -Wrestrict warning I'm about to check in also complains about
> forming invalid pointers by built-ins with restrict-qualified
> arguments (although it won't diagnose the above).
Right. The concern is that it's an new option and folks likely haven't
cleaned up their codebases for these kinds of issues.
>
> Although I would prefer not to, I suppose if letting strlen cross
> the boundaries of subobjects was considered an important use to
> accommodate in limited cases the optimization could be disabled
> for member arrays declared with the new nonstring attribute (while
> still issuing a warning for it as GCC does today).
>
> Another alternative (if the above use case is considered important
> enough) might be to suppress the optimization for member character
> arrays that are immediately followed by another such array.
History tells us that there will be someone out there that does this
kind of thing -- the question is how pervasive is it. My suspicion is
that it is not common.
Given that I don't expect those uses to be common, the only thing that
should break is non-conforming code and we have a (new) warning for such
code my inclination is to go forward.
So I'm OK with the patch. I'd give folks till Monday to chime in with
dissenting opinions.
Jeff