diff options
author | Lubomir I. Ivanov <neolit123@gmail.com> | 2017-12-30 22:01:13 +0200 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2017-12-31 07:58:45 -0800 |
commit | c4e1e96032df3247a4a5f3243c55a51c723d3ae1 (patch) | |
tree | 53b033ec20898abd4734fb4912f54d0e65e1caea /core | |
parent | 779292a322874ed958bc4aaabae4d1a0463882ee (diff) | |
download | subsurface-c4e1e96032df3247a4a5f3243c55a51c723d3ae1.tar.gz |
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>
Diffstat (limited to 'core')
-rw-r--r-- | core/divesite.c | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/core/divesite.c b/core/divesite.c index e4ba71abb..18efead7e 100644 --- a/core/divesite.c +++ b/core/divesite.c @@ -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 */ |