-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