On Mon, May 1, 2017 at 3:31 PM, Daniel Berlin <dber...@dberlin.org> wrote:

> So you believe that you can index into an object randomly by pointer
>>> arithmetic and pull out a different field?
>>>
>>
>> For starters, this is  illegal because you don't know where the padding
>> bytes are.
>> You cannot assume that X.a + 1 == X.b
>> "Implementation alignment requirements might cause two adjacent members
>> not to be allocated immediately after each other;"
>>
>> See 9.2.14
>>
>
> IE at best you'd have to add
>
>  &(struct X*(0))->b - &(struct X*(0))->a
>
>
> I don't believe this is legal either.
>
> Let me try to dredge up the long discussions we had about these cases on
> the gcc mailing lists.
> The conclusion was, i believe:
>
> "if you want to go marching through an object as a char *, that's fine, if
> you expect to be able to get at fields by playing pointer arithmetic games,
> from other fields, that is not)
> I feel like every couple years, a different compiler has the same aliasing
> discussions :)
>

With the caveat that, in practice, compilers have to support both:
  a) "going up a level" by subtracting an offsetof, which is clearly
officially intended and not otherwise supported, and
  b) treating a final or flexible array member, possibly at depth > 1, as
contiguous with a trailing array, because this is an extremely common
extension and artificial idiom.

John.
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to