diff options
| author | Ralf Jung <post@ralfj.de> | 2020-12-29 22:46:17 +0100 |
|---|---|---|
| committer | Ralf Jung <post@ralfj.de> | 2020-12-29 22:46:17 +0100 |
| commit | 95aed7ab3b38f908d357ee5e433946639fff6b03 (patch) | |
| tree | 1e0cb3757e8b39b3ceb7145b75ea3309f1583647 | |
| parent | 158f8d034b15e65ba8dc0d066358dd0632bfcd6e (diff) | |
| download | rust-95aed7ab3b38f908d357ee5e433946639fff6b03.tar.gz rust-95aed7ab3b38f908d357ee5e433946639fff6b03.zip | |
Miri: make size/align_of_val work for dangling raw ptrs
| -rw-r--r-- | compiler/rustc_mir/src/interpret/intrinsics.rs | 6 | ||||
| -rw-r--r-- | compiler/rustc_mir/src/interpret/validity.rs | 2 |
2 files changed, 5 insertions, 3 deletions
diff --git a/compiler/rustc_mir/src/interpret/intrinsics.rs b/compiler/rustc_mir/src/interpret/intrinsics.rs index 474e1f8e577..03f3bd34949 100644 --- a/compiler/rustc_mir/src/interpret/intrinsics.rs +++ b/compiler/rustc_mir/src/interpret/intrinsics.rs @@ -141,9 +141,11 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { } sym::min_align_of_val | sym::size_of_val => { - let place = self.deref_operand(args[0])?; + // Avoid `deref_operand` -- this is not a deref, the ptr does not have to be + // dereferencable! + let place = self.ref_to_mplace(self.read_immediate(args[0])?)?; let (size, align) = self - .size_and_align_of(place.meta, place.layout)? + .size_and_align_of_mplace(place)? .ok_or_else(|| err_unsup_format!("`extern type` does not have known layout"))?; let result = match intrinsic_name { diff --git a/compiler/rustc_mir/src/interpret/validity.rs b/compiler/rustc_mir/src/interpret/validity.rs index 57aec0953b8..aff80dddfdf 100644 --- a/compiler/rustc_mir/src/interpret/validity.rs +++ b/compiler/rustc_mir/src/interpret/validity.rs @@ -391,7 +391,7 @@ impl<'rt, 'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> ValidityVisitor<'rt, 'mir, ' } // Make sure this is dereferenceable and all. let size_and_align = try_validation!( - self.ecx.size_and_align_of(place.meta, place.layout), + self.ecx.size_and_align_of_mplace(place), self.path, err_ub!(InvalidMeta(msg)) => { "invalid {} metadata: {}", kind, msg }, ); |
