summaryrefslogtreecommitdiffstats
path: root/src/termdict
diff options
context:
space:
mode:
authorPaul Masurel <paul.masurel@gmail.com>2019-01-08 00:48:14 +0900
committerPaul Masurel <paul.masurel@gmail.com>2019-01-08 00:48:14 +0900
commitbeb4289ec29d55a7d81b10cf4af61b1fd5b10d29 (patch)
treed893b6327d1fca4daa70bffb95738f300eb05e07 /src/termdict
parentbdd72e4683f08d0af78826033e70cfbbbc5b8d04 (diff)
Less unsafe
Diffstat (limited to 'src/termdict')
-rw-r--r--src/termdict/term_info_store.rs25
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(())
}
}