On Tue, Dec 10, 2013 at 11:53 AM, Eric Botcazou <ebotca...@adacore.com> wrote: >> What we support is out of bounds accesses for heap vars if the var's type >> has flexible array member or something we treat similarly and there is the >> possibility that there could be payload after the heap var that could be >> accessed from the flexible array members or similar arrays. > > My question was about the above similar arrays, i.e. whether we consider all > trailing arrays in structures as flexible-like or not. No strong opinion.
Yes we do, even for struct { struct { int a; char a[1] } }; (note the not really "trailing" as there is padding after the trailing array). We do take size limitations from a DECL (if we see one) into account to limit the effect of this trailing-array-supporting, so it effectively only applies to indirect accesses (and the padding example above, you can use the whole padding if DECL_SIZE allows that). >> So, I don't see what is the big deal with BLKmode, because all the cases >> which actually could have flexible array member extra payloads (or similar) >> must necessarily live in memory, if it is the compiler that decides whether >> to put it into memory or keep in registers etc., then it can't be heap >> allocated. > > The invariant is that types for which objects can effectively have variable > size must have BLKmode, otherwise you need to add very ugly code in the RTL > expander to mask the lie. I wonder if we can make the expander more rely on the DECLs mode and optimize only the DECLs mode (if we can constrain its size via DECL_SIZE) to non-BLKmode instead of doing that for the TYPEs mode. Yes, you'd have DECL_MODE != TYPE_MODE that way. Or rather I wonder if the expander doesn't already work that way (looks at DECL_MODE). Richard. > -- > Eric Botcazou