Messages in this thread | | | Date | Wed, 2 Feb 2011 17:39:32 +0000 (UTC) | From | "Joseph S. Myers" <> | Subject | Re: ARM unaligned MMIO access with attribute((packed)) |
| |
On Wed, 2 Feb 2011, Richard Guenther wrote:
> The pointer conversions already invoke undefined behavior as specified by the > C standard (6.3.2.3/7).
I would say: the conversions are undefined if the pointer is insufficiently aligned for any of the pointer types involved (source, destination or intermediate), where the appropriate alignment for a packed type is 1. Thus, the conversion from packed to non-packed is OK iff the pointer target is sufficiently aligned for the non-packed type.
In general from a sequence of casts the compiler is permitted to deduce that the pointer is sufficiently aligned for whatever type in the sequence has the greatest alignment requirement (the middle-end may not have that information at present, but the front end could insert some form of alignment assertion if useful for optimization). *But* that is what is permitted in standards terms; it is not necessarily safe in practice. In particular, on non-strict-alignment targets such as x86 people do in practice assume that unaligned accesses are OK at the C level, not just the assembly level (glibc does so, for example), so it might be a bad idea to assume alignment in a way that would cause that to break.
-- Joseph S. Myers joseph@codesourcery.com
| |