divesite.c: use union in create_divesite_uuid()

The return produces a warning about "strict-aliasing rules".
Use a union to fit the hash and the uint32_t into the same
block of memory, which obeys the GCC strict-aliasing rules.

Signed-off-by: Lubomir I. Ivanov <neolit123@gmail.com>
This commit is contained in:
Lubomir I. Ivanov 2017-12-30 22:01:13 +02:00 committed by Dirk Hohndel
parent 779292a322
commit c4e1e96032

View file

@ -189,14 +189,17 @@ uint32_t create_divesite_uuid(const char *name, timestamp_t divetime)
{
if (name == NULL)
name ="";
unsigned char hash[20];
union {
unsigned char hash[20];
uint32_t i;
} u;
SHA_CTX ctx;
SHA1_Init(&ctx);
SHA1_Update(&ctx, &divetime, sizeof(timestamp_t));
SHA1_Update(&ctx, name, strlen(name));
SHA1_Final(hash, &ctx);
SHA1_Final(u.hash, &ctx);
// now return the first 32 of the 160 bit hash
return *(uint32_t *)hash;
return u.i;
}
/* allocate a new site and add it to the table */