Skip to content

Commit 552b77e

Browse files
committed
fix types in env shim to avoid ptr-int transmutes
1 parent ede470e commit 552b77e

File tree

3 files changed

+20
-15
lines changed

3 files changed

+20
-15
lines changed

src/machine.rs

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,14 @@ use std::time::Instant;
1010
use rand::rngs::StdRng;
1111
use rand::SeedableRng;
1212

13+
use rustc_ast::ast::Mutability;
1314
use rustc_data_structures::fx::FxHashMap;
1415
use rustc_middle::{
1516
mir,
1617
ty::{
1718
self,
1819
layout::{LayoutCx, LayoutError, LayoutOf, TyAndLayout},
19-
Instance, TyCtxt,
20+
Instance, TyCtxt, TypeAndMut,
2021
},
2122
};
2223
use rustc_span::def_id::{CrateNum, DefId};
@@ -269,19 +270,23 @@ pub struct PrimitiveLayouts<'tcx> {
269270
pub u32: TyAndLayout<'tcx>,
270271
pub usize: TyAndLayout<'tcx>,
271272
pub bool: TyAndLayout<'tcx>,
273+
pub mut_raw_ptr: TyAndLayout<'tcx>,
272274
}
273275

274276
impl<'mir, 'tcx: 'mir> PrimitiveLayouts<'tcx> {
275277
fn new(layout_cx: LayoutCx<'tcx, TyCtxt<'tcx>>) -> Result<Self, LayoutError<'tcx>> {
278+
let tcx = layout_cx.tcx;
279+
let mut_raw_ptr = tcx.mk_ptr(TypeAndMut { ty: tcx.types.unit, mutbl: Mutability::Mut });
276280
Ok(Self {
277-
unit: layout_cx.layout_of(layout_cx.tcx.mk_unit())?,
278-
i8: layout_cx.layout_of(layout_cx.tcx.types.i8)?,
279-
i32: layout_cx.layout_of(layout_cx.tcx.types.i32)?,
280-
isize: layout_cx.layout_of(layout_cx.tcx.types.isize)?,
281-
u8: layout_cx.layout_of(layout_cx.tcx.types.u8)?,
282-
u32: layout_cx.layout_of(layout_cx.tcx.types.u32)?,
283-
usize: layout_cx.layout_of(layout_cx.tcx.types.usize)?,
284-
bool: layout_cx.layout_of(layout_cx.tcx.types.bool)?,
281+
unit: layout_cx.layout_of(tcx.mk_unit())?,
282+
i8: layout_cx.layout_of(tcx.types.i8)?,
283+
i32: layout_cx.layout_of(tcx.types.i32)?,
284+
isize: layout_cx.layout_of(tcx.types.isize)?,
285+
u8: layout_cx.layout_of(tcx.types.u8)?,
286+
u32: layout_cx.layout_of(tcx.types.u32)?,
287+
usize: layout_cx.layout_of(tcx.types.usize)?,
288+
bool: layout_cx.layout_of(tcx.types.bool)?,
289+
mut_raw_ptr: layout_cx.layout_of(mut_raw_ptr)?,
285290
})
286291
}
287292
}

src/shims/backtrace.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use crate::*;
22
use rustc_ast::ast::Mutability;
33
use rustc_middle::ty::layout::LayoutOf as _;
4-
use rustc_middle::ty::{self, Instance, TypeAndMut};
4+
use rustc_middle::ty::{self, Instance};
55
use rustc_span::{BytePos, Loc, Symbol};
66
use rustc_target::{abi::Size, spec::abi::Abi};
77
use std::convert::TryInto as _;
@@ -71,8 +71,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
7171

7272
let len: u64 = ptrs.len().try_into().unwrap();
7373

74-
let ptr_ty = tcx.mk_ptr(TypeAndMut { ty: tcx.types.unit, mutbl: Mutability::Mut });
75-
74+
let ptr_ty = this.machine.layouts.mut_raw_ptr.ty;
7675
let array_layout = this.layout_of(tcx.mk_array(ptr_ty, len)).unwrap();
7776

7877
match flags {

src/shims/env.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -440,7 +440,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
440440
} else {
441441
// No `environ` allocated yet, let's do that.
442442
// This is memory backing an extern static, hence `ExternStatic`, not `Env`.
443-
let layout = this.machine.layouts.usize;
443+
let layout = this.machine.layouts.mut_raw_ptr;
444444
let place = this.allocate(layout, MiriMemoryKind::ExternStatic.into())?;
445445
this.machine.env_vars.environ = Some(place);
446446
}
@@ -452,8 +452,9 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
452452
vars.push(Pointer::null());
453453
// Make an array with all these pointers inside Miri.
454454
let tcx = this.tcx;
455-
let vars_layout =
456-
this.layout_of(tcx.mk_array(tcx.types.usize, u64::try_from(vars.len()).unwrap()))?;
455+
let vars_layout = this.layout_of(
456+
tcx.mk_array(this.machine.layouts.mut_raw_ptr.ty, u64::try_from(vars.len()).unwrap()),
457+
)?;
457458
let vars_place = this.allocate(vars_layout, MiriMemoryKind::Runtime.into())?;
458459
for (idx, var) in vars.into_iter().enumerate() {
459460
let place = this.mplace_field(&vars_place, idx)?;

0 commit comments

Comments
 (0)