diff options
author | Paul Masurel <paul.masurel@gmail.com> | 2019-01-08 00:48:14 +0900 |
---|---|---|
committer | Paul Masurel <paul.masurel@gmail.com> | 2019-01-08 00:48:14 +0900 |
commit | beb4289ec29d55a7d81b10cf4af61b1fd5b10d29 (patch) | |
tree | d893b6327d1fca4daa70bffb95738f300eb05e07 /src/termdict | |
parent | bdd72e4683f08d0af78826033e70cfbbbc5b8d04 (diff) |
Less unsafe
Diffstat (limited to 'src/termdict')
-rw-r--r-- | src/termdict/term_info_store.rs | 25 |
1 files changed, 14 insertions, 11 deletions
diff --git a/src/termdict/term_info_store.rs b/src/termdict/term_info_store.rs index 130b5d6..e23622e 100644 --- a/src/termdict/term_info_store.rs +++ b/src/termdict/term_info_store.rs @@ -1,4 +1,4 @@ -use byteorder::ByteOrder; +use byteorder::{NativeEndian, ByteOrder}; use common::bitpacker::BitPacker; use common::compute_num_bits; use common::Endianness; @@ -7,7 +7,6 @@ use directory::ReadOnlySource; use postings::TermInfo; use std::cmp; use std::io::{self, Read, Write}; -use std::ptr; use termdict::TermOrdinal; const BLOCK_LEN: usize = 256; @@ -21,6 +20,8 @@ struct TermInfoBlockMeta { positions_idx_nbits: u8, } + + impl BinarySerializable for TermInfoBlockMeta { fn serialize<W: Write>(&self, write: &mut W) -> io::Result<()> { self.offset.serialize(write)?; @@ -88,17 +89,20 @@ 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; - assert!(data.len() >= addr_byte + 7); - let val_unshifted_unmasked: u64 = unsafe { - // ok because the pointer is only accessed using `ptr::read_unaligned` - #[cfg_attr(feature = "cargo-clippy", allow(clippy::cast_ptr_alignment))] - let addr = data.as_ptr().add(addr_byte) as *const u64; - // ok thanks to the 7 byte padding - ptr::read_unaligned(addr) - }; + let val_unshifted_unmasked: u64; + if data.len() >= addr_byte + 8 { + val_unshifted_unmasked = NativeEndian::read_u64(&data[addr_byte..][..8]); + } else { + let mut buf = [0u8; 8]; + let data_to_copy = &data[addr_byte..]; + let nbytes = data_to_copy.len(); + buf[..nbytes].copy_from_slice(data_to_copy); + val_unshifted_unmasked = NativeEndian::read_u64(&buf); + } let val_shifted_unmasked = val_unshifted_unmasked >> bit_shift; let mask = (1u64 << u64::from(num_bits)) - 1; val_shifted_unmasked & mask + } impl TermInfoStore { @@ -246,7 +250,6 @@ impl TermInfoStoreWriter { self.num_terms.serialize(write)?; write.write_all(&self.buffer_block_metas)?; write.write_all(&self.buffer_term_infos)?; - write.write_all(&[0u8; 7])?; Ok(()) } } |