]> git.ipfire.org Git - thirdparty/zlib-ng.git/commitdiff
Fix UBSAN's cry afoul
authorAdam Stylinski <kungfujesus06@gmail.com>
Thu, 17 Mar 2022 02:52:44 +0000 (22:52 -0400)
committerHans Kristian Rosbach <hk-github@circlestorm.org>
Thu, 17 Mar 2022 10:05:33 +0000 (11:05 +0100)
Technically, we weren't actually doing this the way C wants us to,
legally.  The zmemcpy's turn into NOPs for pretty much all > 0
optimization levels and this gets us defined behavior with the
sanitizer, putting the optimized load by arbitrary alignment into the
compiler's hands instead of ours.

arch/x86/chunkset_avx.c
arch/x86/chunkset_sse2.c

index 358869bc6a7b985644192ad3d4947e8c0836e6d8..ff5d3c61e3a2fa23f3f9d9d75f960f1e88f71f8b 100644 (file)
@@ -20,15 +20,21 @@ static inline void chunkmemset_1(uint8_t *from, chunk_t *chunk) {
 }
 
 static inline void chunkmemset_2(uint8_t *from, chunk_t *chunk) {
-    *chunk = _mm256_set1_epi16(*(int16_t *)from);
+    int16_t tmp;
+    zmemcpy_2(&tmp, from);
+    *chunk = _mm256_set1_epi16(tmp);
 }
 
 static inline void chunkmemset_4(uint8_t *from, chunk_t *chunk) {
-    *chunk = _mm256_set1_epi32(*(int32_t *)from);
+    int32_t tmp;
+    zmemcpy_4(&tmp, from);
+    *chunk = _mm256_set1_epi32(tmp);
 }
 
 static inline void chunkmemset_8(uint8_t *from, chunk_t *chunk) {
-    *chunk = _mm256_set1_epi64x(*(int64_t *)from);
+    int64_t tmp;
+    zmemcpy_8(&tmp, from);
+    *chunk = _mm256_set1_epi64x(tmp);
 }
 
 static inline void loadchunk(uint8_t const *s, chunk_t *chunk) {
index 59b86f15cac75f6e265814298db650fbb3f2a3fd..778e4ca14ab4b000eab5f5d894e9acc52017ec34 100644 (file)
@@ -21,15 +21,21 @@ static inline void chunkmemset_1(uint8_t *from, chunk_t *chunk) {
 }
 
 static inline void chunkmemset_2(uint8_t *from, chunk_t *chunk) {
-    *chunk = _mm_set1_epi16(*(int16_t *)from);
+    int16_t tmp;
+    zmemcpy_2(&tmp, from);
+    *chunk = _mm_set1_epi16(tmp);
 }
 
 static inline void chunkmemset_4(uint8_t *from, chunk_t *chunk) {
-    *chunk = _mm_set1_epi32(*(int32_t *)from);
+    int32_t tmp;
+    zmemcpy_4(&tmp, from);
+    *chunk = _mm_set1_epi32(tmp);
 }
 
 static inline void chunkmemset_8(uint8_t *from, chunk_t *chunk) {
-    *chunk = _mm_set1_epi64x(*(int64_t *)from);
+    int64_t tmp;
+    zmemcpy_8(&tmp, from);
+    *chunk = _mm_set1_epi64x(tmp);
 }
 
 static inline void loadchunk(uint8_t const *s, chunk_t *chunk) {