src/libunixonacid/textclient_server_init_fromsocket.c:56:3: warning: 
dereferencing type-punned pointer will break strict-aliasing rules 
[-Wstrict-aliasing]
   *(int *)CMSG_DATA(c) = fd[1] ;
   ^

 Yeah, some compilers actually print that warning.
It's annoying, because this is the official way, and really the only way,
of using CMSG_DATA(). It breaks strict aliasing, but it's okay, because
in the case of SCM_RIGHTS transmission, nothing ever uses CMSG_DATA(c) as
an array of unsigned char; it's always written and read as an array of
ints, and holds file descriptors.
 Honestly, the spec of CMSG_DATA() is to blame: it should be void *, or
at the very least, char *. Making it unsigned char * was really
short-sighted, and the root cause for the strict aliasing violation.

I don't want to "fix" this in my code, because the code as it is written
is as clear as can be. A "fix" would imply a double cast through void *,
which would decrease readability - not a good trade for two spurious
compiler warnings.

--
 Laurent

Reply via email to