]> git.lizzy.rs Git - rust.git/commitdiff
Fix undef mask initialization and test undef reads.
authorScott Olson <scott@solson.me>
Wed, 6 Apr 2016 10:35:25 +0000 (04:35 -0600)
committerScott Olson <scott@solson.me>
Wed, 6 Apr 2016 10:35:25 +0000 (04:35 -0600)
src/memory.rs
test/errors.rs

index c8f19fa165fa5bad407ced2c6be66e422e80619c..84cd95409b8b935f22a7be96bd1adf0ee15b3e1a 100644 (file)
@@ -106,7 +106,7 @@ pub fn allocate(&mut self, size: usize) -> Pointer {
         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;
@@ -426,11 +426,13 @@ pub struct UndefMask {
 }
 
 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.
index 8d66ec48ad146a2cbf7b1df7b084671bd9c9730c..c6e6e16b889fc72e2abc8ddacdc95a2a226e991c 100755 (executable)
@@ -23,3 +23,10 @@ fn invalid_bools_are_rejected() -> u8 {
     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
+}