Andrew Haley wrote:
gcc should always generate correct code for accessing unaligned data.
but Paul Brook wrote:
You can't reliably take the address of a member of a packed structure (gcc doesn't
have unaligned pointers).
Are you both right? At first your comments look contradictory, but my
slow brain is starting to understand now.
I think you're saying that I can declare something that is unaligned:
char c;
struct foo f; // unaligned
and then operate on it locally:
f.a++;
because gcc knows that f.a is unaligned and on a machine that doesn't
do unaligned accesses it can generate appropriate byte-shuffling code.
But if I take its address:
func(&f.a);
it won't work, because func() assumes that the pointer it is passed is aligned.
Is this correct? A quick test seems to indicate that this is indeed
what happens.
But I don't get any error or warning when I do this. Would you agree
that an error (or at least a "big fat warning") would be appropriate at
the point where I wrote &f.a?
Thanks for your help.
Regards,
Phil.