]> git.lizzy.rs Git - rust.git/commitdiff
Add a test for overwriting part of a relocation.
authorScott Olson <scott@solson.me>
Wed, 6 Apr 2016 10:19:36 +0000 (04:19 -0600)
committerScott Olson <scott@solson.me>
Wed, 6 Apr 2016 10:19:56 +0000 (04:19 -0600)
src/interpreter.rs
test/errors.rs [new file with mode: 0755]

index b050e042f711db24219617c91e217a1cde4a634f..d0faf7dc15330707039fd0de5d7e8d8c2db7fb4f 100644 (file)
@@ -411,6 +411,25 @@ fn call_intrinsic(&mut self, name: &str, substs: &'tcx Substs<'tcx>,
                 try!(self.memory.copy(val, ptr, size));
             }
 
+            // FIXME(tsion): Handle different integer types correctly.
+            "add_with_overflow" => {
+                let ty = *substs.types.get(subst::FnSpace, 0);
+                let size = self.ty_size(ty);
+
+                let left_arg  = try!(self.eval_operand(&args[0]));
+                let right_arg = try!(self.eval_operand(&args[1]));
+
+                let left = try!(self.memory.read_int(left_arg, size));
+                let right = try!(self.memory.read_int(right_arg, size));
+
+                let (n, overflowed) = unsafe {
+                    ::std::intrinsics::add_with_overflow::<i64>(left, right)
+                };
+
+                try!(self.memory.write_int(dest, n, size));
+                try!(self.memory.write_bool(dest.offset(size as isize), overflowed));
+            }
+
             // FIXME(tsion): Handle different integer types correctly.
             "mul_with_overflow" => {
                 let ty = *substs.types.get(subst::FnSpace, 0);
@@ -1174,15 +1193,13 @@ pub fn interpret_start_points<'tcx>(tcx: &TyCtxt<'tcx>, mir_map: &MirMap<'tcx>)
                 };
                 let substs = miri.tcx.mk_substs(Substs::empty());
                 miri.push_stack_frame(CachedMir::Ref(mir), substs, return_ptr);
-                if let Err(e) = miri.run() {
-                    tcx.sess.err(&e.to_string());
-                }
-                tcx.sess.abort_if_errors();
-
-                if let Some(ret) = return_ptr {
+                if let Err(_e) = miri.run() {
+                    // TODO(tsion): Detect whether the error was already reported or not.
+                    // tcx.sess.err(&e.to_string());
+                } else if let Some(ret) = return_ptr {
                     miri.memory.dump(ret.alloc_id);
-                    println!("");
                 }
+                println!("");
             }
         }
     }
diff --git a/test/errors.rs b/test/errors.rs
new file mode 100755 (executable)
index 0000000..1b0401b
--- /dev/null
@@ -0,0 +1,12 @@
+#![feature(custom_attribute)]
+#![allow(dead_code, unused_attributes)]
+
+#[miri_run]
+fn overwriting_part_of_relocation_makes_the_rest_undefined() -> i32 {
+    let mut p: *const i32 = &42;
+    unsafe {
+        let ptr = &mut p as *mut *const i32 as *mut u32;
+        *ptr = 123;
+        *p
+    }
+}