-Wcast-align and struct sockaddr_in / struct sockaddr: why the warning?
Evan Jones
evanj@MIT.EDU
Mon Sep 14 11:42:00 GMT 2009
Ian Lance Taylor wrote:
> The size of the type does not describe the required alignment of the
> type. If, say, struct sockaddr is defined as { char x[16]; } then the
> size is 16 but it may be aligned on any 8-bit boundary. If, say, struct
> sockaddr_in has fields of type short or int, then the size may be 16 but
> it may require alignment on a 16-bit or 32-bit boundary.
Whoops, I should have figured that out. Thanks for the detailed answer.
I guess I'm just annoyed that you can't use the sockets API without
producing these warnings. Good thing the "assign to void*" workaround
exists.
For reference, this issue occurred when compiling for Solaris/Sparc,
where the definitions seem to be:
struct sockaddr {
sa_family_t sa_family; /* address family */
char sa_data[14]; /* up to 14 bytes of direct
address */
};
struct sockaddr_in {
sa_family_t sin_family;
in_port_t sin_port;
struct in_addr sin_addr;
unsigned char sin_zero[8];
};
sa_family_t = uint16_t;
in_port_t = uint16_t
struct in_addr = gross union of stuff; 32-bits wide
So I guess I understand this now: sockaddr probably needs 16-bit
alignment (due to sa_family), whereas sockaddr_in needs 32-bit alignment
(due to sin_addr).
Thanks for your help,
Evan Jones
--
Evan Jones
http://evanjones.ca/
More information about the Gcc-help
mailing list