This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
Re: libiberty/md5: fix strict alias warnings
- From: Matthias Klose <doko at ubuntu dot com>
- To: Mike Frysinger <vapier at gentoo dot org>
- Cc: binutils at sourceware dot org, Tristan Gingold <gingold at adacore dot com>
- Date: Tue, 31 Jul 2012 22:55:40 +0200
- Subject: Re: libiberty/md5: fix strict alias warnings
- References: <201207271436.09109.vapier@gentoo.org> <201207310502.30735.vapier@gentoo.org>
Please could you push this to the 2.23 branch too?
On 31.07.2012 11:02, Mike Frysinger wrote:
> [i've pushed this fix into the binutils repo since it has been merged into
> gcc]
>
> Current libiberty md5 code triggers these warnings with gcc-4.7.1 for me:
>
> libiberty/md5.c: In function âmd5_finish_ctxâ: libiberty/md5.c:117:3:
> warning: dereferencing type-punned pointer will break strict-aliasing rules
> [-Wstrict-aliasing] libiberty/md5.c:118:3: warning: dereferencing
> type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
>
> The change below fixes things for me. The optimized output (-O2) is the
> same before/after my change on x86_64-linux. I imagine it'll be the same
> for most targets. It seems simpler than using a union on the md5_ctx
> buffer since these are the only two locations in the code where this
> occurs.
>
> diff --git a/libiberty/ChangeLog b/libiberty/ChangeLog index
> 349dc98..6615047 100644 --- a/libiberty/ChangeLog +++
> b/libiberty/ChangeLog @@ -1,3 +1,8 @@ +2012-07-31 Mike Frysinger
> <vapier@gentoo.org> + + * md5.c (md5_finish_ctx): Declare swap_bytes.
> Assign SWAP() output + to swap_bytes, and then call memcpy to move it to
> ctx->buffer. + 2012-07-26 Kazu Hirata <kazu@codesourcery.com> Sandra
> Loosemore <sandra@codesourcery.com>
>
> diff --git a/libiberty/md5.c b/libiberty/md5.c index 0db8fc8..8cc0cb5
> 100644 --- a/libiberty/md5.c +++ b/libiberty/md5.c @@ -103,6 +103,7 @@
> md5_finish_ctx (struct md5_ctx *ctx, void *resbuf) { /* Take yet
> unprocessed bytes into account. */ md5_uint32 bytes = ctx->buflen; +
> md5_uint32 swap_bytes; size_t pad;
>
> /* Now count remaining bytes. */ @@ -113,10 +114,13 @@ md5_finish_ctx
> (struct md5_ctx *ctx, void *resbuf) pad = bytes >= 56 ? 64 + 56 - bytes :
> 56 - bytes; memcpy (&ctx->buffer[bytes], fillbuf, pad);
>
> - /* Put the 64-bit file length in *bits* at the end of the buffer. */ -
> *(md5_uint32 *) &ctx->buffer[bytes + pad] = SWAP (ctx->total[0] << 3); -
> *(md5_uint32 *) &ctx->buffer[bytes + pad + 4] = SWAP ((ctx->total[1] << 3)
> | - (ctx->total[0] >> 29)); + /* Put the 64-bit file length in
> *bits* at the end of the buffer. + Use memcpy to avoid aliasing
> problems. On most systems, this + will be optimized away to the same
> code. */ + swap_bytes = SWAP (ctx->total[0] << 3); + memcpy
> (&ctx->buffer[bytes + pad], &swap_bytes, sizeof (swap_bytes)); +
> swap_bytes = SWAP ((ctx->total[1] << 3) | (ctx->total[0] >> 29)); + memcpy
> (&ctx->buffer[bytes + pad + 4], &swap_bytes, sizeof (swap_bytes));
>
> /* Process last bytes. */ md5_process_block (ctx->buffer, bytes + pad + 8,
> ctx);
>