From: Scott Olson Date: Wed, 6 Apr 2016 10:19:36 +0000 (-0600) Subject: Add a test for overwriting part of a relocation. X-Git-Url: https://git.lizzy.rs/?a=commitdiff_plain;h=dbd8a826431b959af98141bbc52aada52931b508;p=rust.git Add a test for overwriting part of a relocation. --- diff --git a/src/interpreter.rs b/src/interpreter.rs index b050e042f71..d0faf7dc153 100644 --- a/src/interpreter.rs +++ b/src/interpreter.rs @@ -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::(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 00000000000..1b0401bb9cc --- /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 + } +}