let alloc = Allocation {
bytes: vec![0; size].into_boxed_slice(),
relocations: BTreeMap::new(),
- undef_mask: UndefMask::new(),
+ undef_mask: UndefMask::new(size),
};
self.alloc_map.insert(self.next_id, alloc);
self.next_id += 1;
}
impl UndefMask {
- fn new() -> Self {
- UndefMask {
+ fn new(size: usize) -> Self {
+ let mut m = UndefMask {
blocks: vec![],
len: 0,
- }
+ };
+ m.grow(size, false);
+ m
}
/// Check whether the range `start..end` (end-exclusive) is entirely defined.
let b = unsafe { std::mem::transmute::<u8, bool>(2) };
if b { 1 } else { 2 }
}
+
+#[miri_run]
+fn undefined_byte_reads_are_rejected() -> u8 {
+ let v: Vec<u8> = Vec::with_capacity(10);
+ let undef = unsafe { *v.get_unchecked(5) };
+ undef + 1
+}