Skip to content

Commit 2f4c2e4

Browse files
asg017claude
andcommitted
Fix alignment UB in distance_hamming_u64
Casting unaligned blob pointers to u64* is undefined behavior on strict-alignment architectures. Use memcpy to safely load u64 values from potentially unaligned memory (compilers optimize this to native loads on architectures that support unaligned access). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 7de925b commit 2f4c2e4

File tree

1 file changed

+6
-3
lines changed

1 file changed

+6
-3
lines changed

sqlite-vec.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -734,10 +734,13 @@ static unsigned int __builtin_popcountl(unsigned int x) {
734734
#endif
735735
#endif
736736

737-
static f32 distance_hamming_u64(u64 *a, u64 *b, size_t n) {
737+
static f32 distance_hamming_u64(const u8 *a, const u8 *b, size_t n) {
738738
int same = 0;
739739
for (unsigned long i = 0; i < n; i++) {
740-
same += __builtin_popcountl(a[i] ^ b[i]);
740+
u64 va, vb;
741+
memcpy(&va, a + i * sizeof(u64), sizeof(u64));
742+
memcpy(&vb, b + i * sizeof(u64), sizeof(u64));
743+
same += __builtin_popcountl(va ^ vb);
741744
}
742745
return (f32)same;
743746
}
@@ -761,7 +764,7 @@ static f32 distance_hamming(const void *a, const void *b, const void *d) {
761764
#endif
762765

763766
if ((dimensions % 64) == 0) {
764-
return distance_hamming_u64((u64 *)a, (u64 *)b, n_bytes / sizeof(u64));
767+
return distance_hamming_u64((const u8 *)a, (const u8 *)b, n_bytes / sizeof(u64));
765768
}
766769
return distance_hamming_u8((u8 *)a, (u8 *)b, n_bytes);
767770
}

0 commit comments

Comments
 (0)