From dbd8a826431b959af98141bbc52aada52931b508 Mon Sep 17 00:00:00 2001 From: Scott Olson Date: Wed, 6 Apr 2016 04:19:36 -0600 Subject: [PATCH] Add a test for overwriting part of a relocation. --- src/interpreter.rs | 31 ++++++++++++++++++++++++------- test/errors.rs | 12 ++++++++++++ 2 files changed, 36 insertions(+), 7 deletions(-) create mode 100755 test/errors.rs diff --git a/src/interpreter.rs b/src/interpreter.rs index b050e042f711..d0faf7dc1533 100644 --- a/src/interpreter.rs +++ b/src/interpreter.rs @@ -411,6 +411,25 @@ impl<'a, 'tcx: 'a, 'arena> Interpreter<'a, 'tcx, 'arena> { 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::(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 index 000000000000..1b0401bb9cc2 --- /dev/null +++ b/test/errors.rs @@ -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 + } +}