]> git.lizzy.rs Git - rust.git/commitdiff
fix types in env shim to avoid ptr-int transmutes
authorRalf Jung <post@ralfj.de>
Sat, 26 Mar 2022 18:29:58 +0000 (14:29 -0400)
committerRalf Jung <post@ralfj.de>
Sat, 26 Mar 2022 18:33:13 +0000 (14:33 -0400)
src/machine.rs
src/shims/backtrace.rs
src/shims/env.rs

index 2cf7cd0fae0e26f5a9d0ad37ed6422b7d69c4f72..9c763149ffa21f0e527158b55dccc4663a667781 100644 (file)
 use rand::rngs::StdRng;
 use rand::SeedableRng;
 
+use rustc_ast::ast::Mutability;
 use rustc_data_structures::fx::FxHashMap;
 use rustc_middle::{
     mir,
     ty::{
         self,
         layout::{LayoutCx, LayoutError, LayoutOf, TyAndLayout},
-        Instance, TyCtxt,
+        Instance, TyCtxt, TypeAndMut,
     },
 };
 use rustc_span::def_id::{CrateNum, DefId};
@@ -269,19 +270,23 @@ pub struct PrimitiveLayouts<'tcx> {
     pub u32: TyAndLayout<'tcx>,
     pub usize: TyAndLayout<'tcx>,
     pub bool: TyAndLayout<'tcx>,
+    pub mut_raw_ptr: TyAndLayout<'tcx>,
 }
 
 impl<'mir, 'tcx: 'mir> PrimitiveLayouts<'tcx> {
     fn new(layout_cx: LayoutCx<'tcx, TyCtxt<'tcx>>) -> Result<Self, LayoutError<'tcx>> {
+        let tcx = layout_cx.tcx;
+        let mut_raw_ptr = tcx.mk_ptr(TypeAndMut { ty: tcx.types.unit, mutbl: Mutability::Mut });
         Ok(Self {
-            unit: layout_cx.layout_of(layout_cx.tcx.mk_unit())?,
-            i8: layout_cx.layout_of(layout_cx.tcx.types.i8)?,
-            i32: layout_cx.layout_of(layout_cx.tcx.types.i32)?,
-            isize: layout_cx.layout_of(layout_cx.tcx.types.isize)?,
-            u8: layout_cx.layout_of(layout_cx.tcx.types.u8)?,
-            u32: layout_cx.layout_of(layout_cx.tcx.types.u32)?,
-            usize: layout_cx.layout_of(layout_cx.tcx.types.usize)?,
-            bool: layout_cx.layout_of(layout_cx.tcx.types.bool)?,
+            unit: layout_cx.layout_of(tcx.mk_unit())?,
+            i8: layout_cx.layout_of(tcx.types.i8)?,
+            i32: layout_cx.layout_of(tcx.types.i32)?,
+            isize: layout_cx.layout_of(tcx.types.isize)?,
+            u8: layout_cx.layout_of(tcx.types.u8)?,
+            u32: layout_cx.layout_of(tcx.types.u32)?,
+            usize: layout_cx.layout_of(tcx.types.usize)?,
+            bool: layout_cx.layout_of(tcx.types.bool)?,
+            mut_raw_ptr: layout_cx.layout_of(mut_raw_ptr)?,
         })
     }
 }
index 541cec8e8474325b9247c8b8c46d2b12f840e1f4..6a8a9553e93639a875c773619398c5984d4b5ab0 100644 (file)
@@ -1,7 +1,7 @@
 use crate::*;
 use rustc_ast::ast::Mutability;
 use rustc_middle::ty::layout::LayoutOf as _;
-use rustc_middle::ty::{self, Instance, TypeAndMut};
+use rustc_middle::ty::{self, Instance};
 use rustc_span::{BytePos, Loc, Symbol};
 use rustc_target::{abi::Size, spec::abi::Abi};
 use std::convert::TryInto as _;
@@ -71,8 +71,7 @@ fn handle_miri_get_backtrace(
 
         let len: u64 = ptrs.len().try_into().unwrap();
 
-        let ptr_ty = tcx.mk_ptr(TypeAndMut { ty: tcx.types.unit, mutbl: Mutability::Mut });
-
+        let ptr_ty = this.machine.layouts.mut_raw_ptr.ty;
         let array_layout = this.layout_of(tcx.mk_array(ptr_ty, len)).unwrap();
 
         match flags {
index 1916d7d70a41ebf8ee223115bf5fcc3dcafbb4a9..c2050647abca2a3d9535399a483e30ae134d96b0 100644 (file)
@@ -440,7 +440,7 @@ fn update_environ(&mut self) -> InterpResult<'tcx> {
         } else {
             // No `environ` allocated yet, let's do that.
             // This is memory backing an extern static, hence `ExternStatic`, not `Env`.
-            let layout = this.machine.layouts.usize;
+            let layout = this.machine.layouts.mut_raw_ptr;
             let place = this.allocate(layout, MiriMemoryKind::ExternStatic.into())?;
             this.machine.env_vars.environ = Some(place);
         }
@@ -452,8 +452,9 @@ fn update_environ(&mut self) -> InterpResult<'tcx> {
         vars.push(Pointer::null());
         // Make an array with all these pointers inside Miri.
         let tcx = this.tcx;
-        let vars_layout =
-            this.layout_of(tcx.mk_array(tcx.types.usize, u64::try_from(vars.len()).unwrap()))?;
+        let vars_layout = this.layout_of(
+            tcx.mk_array(this.machine.layouts.mut_raw_ptr.ty, u64::try_from(vars.len()).unwrap()),
+        )?;
         let vars_place = this.allocate(vars_layout, MiriMemoryKind::Runtime.into())?;
         for (idx, var) in vars.into_iter().enumerate() {
             let place = this.mplace_field(&vars_place, idx)?;