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