md5/sha512: a better fix for strict aliasing warnings
authorDenys Vlasenko <vda.linux@googlemail.com>
Wed, 26 Jun 2013 23:03:19 +0000 (01:03 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Wed, 26 Jun 2013 23:03:19 +0000 (01:03 +0200)
The locations *are* well-aligned for direct stores
on any architecture.

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
include/platform.h
libbb/hash_md5_sha.c

index 917d87d..0fa9f61 100644 (file)
@@ -208,6 +208,7 @@ typedef int      bb__aliased_int      FIX_ALIASING;
 typedef long     bb__aliased_long     FIX_ALIASING;
 typedef uint16_t bb__aliased_uint16_t FIX_ALIASING;
 typedef uint32_t bb__aliased_uint32_t FIX_ALIASING;
+typedef uint64_t bb__aliased_uint64_t FIX_ALIASING;
 
 /* NB: unaligned parameter should be a pointer, aligned one -
  * a lvalue. This makes it more likely to not swap them by mistake
index e10cb39..3f743ac 100644 (file)
@@ -84,7 +84,7 @@ static void FAST_FUNC common64_end(md5_ctx_t *ctx, int swap_needed)
                        if (swap_needed)
                                t = bb_bswap_64(t);
                        /* wbuffer is suitably aligned for this */
-                       memcpy(&ctx->wbuffer[64 - 8], &t, sizeof(t));
+                       *(bb__aliased_uint64_t *) (&ctx->wbuffer[64 - 8]) = t;
                }
                ctx->process_block(ctx);
                if (remaining >= 8)
@@ -883,10 +883,10 @@ void FAST_FUNC sha512_end(sha512_ctx_t *ctx, void *resbuf)
                        uint64_t t;
                        t = ctx->total64[0] << 3;
                        t = SWAP_BE64(t);
-                       memcpy(&ctx->wbuffer[128 - 8], &t, sizeof(t));
+                       *(bb__aliased_uint64_t *) (&ctx->wbuffer[128 - 8]) = t;
                        t = (ctx->total64[1] << 3) | (ctx->total64[0] >> 61);
                        t = SWAP_BE64(t);
-                       memcpy(&ctx->wbuffer[128 - 16], &t, sizeof(t));
+                       *(bb__aliased_uint64_t *) (&ctx->wbuffer[128 - 16]) = t;
                }
                sha512_process_block128(ctx);
                if (remaining >= 16)