C++ does not allow implicit conversion from void pointer to a specific
pointer type. This change removes the cast from uint32_t* to void* in
`hash_words_32aligned` and adds an explicit typecast from uint32_t* to
uint64_t* in `hash_words_inline`.

This issue was initially discovered on G++ v9.2.0 when a downstream C++
application included the hash.h header file and was compiled on an AMD
Ryzen Zen 2 CPU (__SSE4_2__ && __x86_64__). On the latest G++ version,
it would throw an error. On the latest GCC version with `-Wc++-compat`,
it would throw a warning.

Acked-by: Mike Pattrick <[email protected]>
Signed-off-by: James Raphael Tiovalen <[email protected]>
---
Revisions:

v1 -> v2: Fix build issue due to `-Wcast-align=strict` warning.
v2 -> v3: Fix `-Warray-bounds=1` warning.
v3 -> v4: Use `ALIGNED_CAST` as per Ilya's suggestion.
---
 lib/hash.h | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/lib/hash.h b/lib/hash.h
index 7b7f70c11..27ad782ea 100644
--- a/lib/hash.h
+++ b/lib/hash.h
@@ -200,7 +200,7 @@ hash_finish32(uint64_t hash, uint32_t final, uint32_t 
semifinal)
 static inline uint32_t
 hash_words_32aligned(const uint32_t *p_, size_t n_words, uint32_t basis)
 {
-    const uint32_t *p = (const void *) p_;
+    const uint32_t *p = p_;
     uint32_t hash1 = basis;
     uint32_t hash2 = 0;
     uint32_t hash3 = n_words;
@@ -254,7 +254,7 @@ hash_words_32aligned(const uint32_t *p_, size_t n_words, 
uint32_t basis)
 static inline uint32_t
 hash_words_inline(const uint32_t *p_, size_t n_words, uint32_t basis)
 {
-    const uint64_t *p = (const void *)p_;
+    const uint64_t *p =  ALIGNED_CAST(const uint64_t *, p_);
     uint64_t hash1 = basis;
     uint64_t hash2 = 0;
     uint64_t hash3 = n_words;
--
2.42.0

_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to