Skip to content

Commit dd732e5

Browse files
committed
Force intptrcast for binary operations
1 parent e574470 commit dd732e5

File tree

3 files changed

+27
-7
lines changed

3 files changed

+27
-7
lines changed

src/lib.rs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -637,26 +637,28 @@ impl<'mir, 'tcx> Machine<'mir, 'tcx> for Evaluator<'tcx> {
637637

638638
let alloc = memory.get(ptr.alloc_id)?;
639639

640-
let base_addr = match alloc.extra.base_addr.borrow().clone() {
641-
Some(base_addr) => base_addr,
640+
let mut base_addr = alloc.extra.base_addr.borrow_mut();
641+
642+
let addr = match *base_addr {
643+
Some(addr) => addr,
642644
None => {
643-
let base_addr = extra.addr;
645+
let addr = extra.addr;
644646
extra.addr += alloc.bytes.len() as u64;
645647

646-
*alloc.extra.base_addr.borrow_mut() = Some(base_addr);
648+
*base_addr = Some(addr);
647649

648-
let elem = (base_addr, ptr.alloc_id);
650+
let elem = (addr, ptr.alloc_id);
649651

650652
if let Err(pos) = extra.vec.binary_search(&elem) {
651653
extra.vec.insert(pos, elem);
652654
} else {
653655
return err!(Unreachable);
654656
}
655657

656-
base_addr
658+
addr
657659
}
658660
};
659661

660-
Ok(base_addr + ptr.offset.bytes())
662+
Ok(addr + ptr.offset.bytes())
661663
}
662664
}

src/operator.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,16 @@ impl<'mir, 'tcx> EvalContextExt<'tcx> for super::MiriEvalContext<'mir, 'tcx> {
4444

4545
trace!("ptr_op: {:?} {:?} {:?}", *left, bin_op, *right);
4646

47+
if self.memory().extra.seed.is_some() && bin_op != Offset {
48+
let l_bits = self.force_bits(left.imm.to_scalar()?, left.layout.size)?;
49+
let r_bits = self.force_bits(right.imm.to_scalar()?, right.layout.size)?;
50+
51+
let left = ImmTy::from_scalar(Scalar::from_uint(l_bits, left.layout.size), left.layout);
52+
let right = ImmTy::from_scalar(Scalar::from_uint(r_bits, left.layout.size), right.layout);
53+
54+
return self.binary_op(bin_op, left, right);
55+
}
56+
4757
// Operations that support fat pointers
4858
match bin_op {
4959
Eq | Ne => {

tests/run-pass/intptrcast-truncate.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
// compile-flags: -Zmiri-seed=0000000000000000
2+
3+
fn main() {
4+
let x = &42 as *const i32 as usize;
5+
let y = x * 2;
6+
let z = y as u8 as usize;
7+
assert_eq!(z, y % 256);
8+
}

0 commit comments

Comments
 (0)