diff --git a/src/termdict/term_info_store.rs b/src/termdict/term_info_store.rs index 86d74fffe..e5f8b83b4 100644 --- a/src/termdict/term_info_store.rs +++ b/src/termdict/term_info_store.rs @@ -6,8 +6,8 @@ use common::{BinarySerializable, FixedSize}; use directory::ReadOnlySource; use postings::TermInfo; use std::cmp; -use std::io; -use std::io::{Read, Write}; +use std::ptr; +use std::io::{self, Read, Write}; use termdict::TermOrdinal; const BLOCK_LEN: usize = 256; @@ -92,7 +92,10 @@ fn extract_bits(data: &[u8], addr_bits: usize, num_bits: u8) -> u64 { assert!(num_bits <= 56); let addr_byte = addr_bits / 8; let bit_shift = (addr_bits % 8) as u64; - let val_unshifted_unmasked: u64 = unsafe { *(data[addr_byte..].as_ptr() as *const u64) }; + let val_unshifted_unmasked: u64 = unsafe { + let addr = data.as_ptr().offset(addr_byte as isize) as *const u64; + ptr::read_unaligned(addr) + }; let val_shifted_unmasked = val_unshifted_unmasked >> bit_shift; let mask = (1u64 << u64::from(num_bits)) - 1; val_shifted_unmasked & mask