[CRIU] Re: [PATCH 4/5] util-net: Fix strict aliasing problem on certain compilers

Pavel Emelyanov xemul at parallels.com
Tue Jul 31 06:10:47 EDT 2012


On 07/28/2012 04:13 PM, Cyrill Gorcunov wrote:
> gcc version 4.4.5 20110214 (Red Hat 4.4.5-6) (GCC)
> complains on strict aliasing problem if the program
> get built with -O2 flag.
> 
> Make a workaround here.
> 
> Signed-off-by: Cyrill Gorcunov <gorcunov at openvz.org>
> ---
>  util-net.c |   15 +++++++++++----
>  1 files changed, 11 insertions(+), 4 deletions(-)
> 
> diff --git a/util-net.c b/util-net.c
> index 090a8d7..435f43c 100644
> --- a/util-net.c
> +++ b/util-net.c
> @@ -23,7 +23,7 @@ static void scm_fdset_init_chunk(struct scm_fdset *fdset, int nr_fds)
>  static int *scm_fdset_init(struct scm_fdset *fdset, struct sockaddr_un *saddr,
>  		int saddr_len, bool with_flags)
>  {
> -	struct cmsghdr *cmsg;
> +	struct cmsghdr *cmsg, from;
>  
>  	BUILD_BUG_ON(CR_SCM_MAX_FD > SCM_MAX_FD);
>  	BUILD_BUG_ON(sizeof(fdset->msg_buf) < (CMSG_SPACE(sizeof(int) * CR_SCM_MAX_FD)));
> @@ -39,10 +39,17 @@ static int *scm_fdset_init(struct scm_fdset *fdset, struct sockaddr_un *saddr,
>  	fdset->hdr.msg_control		= &fdset->msg_buf;
>  	fdset->hdr.msg_controllen	= CMSG_LEN(sizeof(int) * CR_SCM_MAX_FD);
>  
> +	/*
> +	 * GCC-4.4.5 has been complaining on strict aliasing
> +	 * violation if we dereference cmsg directly, so lets
> +	 * make a workaround and use memcpy here.
> +	 */
>  	cmsg				= CMSG_FIRSTHDR(&fdset->hdr);
> -	cmsg->cmsg_len			= fdset->hdr.msg_controllen;
> -	cmsg->cmsg_level		= SOL_SOCKET;
> -	cmsg->cmsg_type			= SCM_RIGHTS;

Huh? How does the net/core/rtnetlink.c work then?! It uses such tricks all the way around!

> +	from.cmsg_len			= fdset->hdr.msg_controllen;
> +	from.cmsg_level			= SOL_SOCKET;
> +	from.cmsg_type			= SCM_RIGHTS;
> +
> +	builtin_memcpy(cmsg, &from, sizeof(from));
>  
>  	return (int *)CMSG_DATA(cmsg);
>  }



More information about the CRIU mailing list