Add a test for overwriting part of a relocation.
This commit is contained in:
parent
c08ddaaa48
commit
dbd8a82643
2 changed files with 36 additions and 7 deletions
|
|
@ -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::<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!("");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
12
test/errors.rs
Executable file
12
test/errors.rs
Executable file
|
|
@ -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
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue