Subject: [PATCH] Read unaligned match buffers with memcpy Byte buffers need not satisfy integer alignment or aliasing requirements. GCC 16 with x86-64-v3 vectorizes the cast loads using aligned AVX reads, causing a segmentation fault. Copy into local integers instead. --- a/src/zopfli/lz77.c +++ b/src/zopfli/lz77.c @@ -302,13 +302,20 @@ if (sizeof(size_t) == 8) { /* 8 checks at once per array bounds check (size_t is 64-bit). */ - while (scan < safe_end && *((size_t*)scan) == *((size_t*)match)) { + while (scan < safe_end) { + size_t scan_word, match_word; + memcpy(&scan_word, scan, sizeof(scan_word)); + memcpy(&match_word, match, sizeof(match_word)); + if (scan_word != match_word) break; scan += 8; match += 8; } } else if (sizeof(unsigned int) == 4) { /* 4 checks at once per array bounds check (unsigned int is 32-bit). */ - while (scan < safe_end - && *((unsigned int*)scan) == *((unsigned int*)match)) { + while (scan < safe_end) { + unsigned int scan_word, match_word; + memcpy(&scan_word, scan, sizeof(scan_word)); + memcpy(&match_word, match, sizeof(match_word)); + if (scan_word != match_word) break; scan += 4; match += 4; }