Auto merge of #131006 - RalfJung:immediate-sanity, r=saethlin
interpret: always enable write_immediate sanity checks Writing a wrongly-sized scalar somewhere can have quite confusing effects. Let's see how expensive it is to catch this early.
This commit is contained in:
commit
9c7013c15c
2 changed files with 6 additions and 3 deletions
|
@ -118,6 +118,7 @@ impl<Prov: Provenance> Immediate<Prov> {
|
||||||
(Immediate::Scalar(scalar), Abi::Scalar(s)) => {
|
(Immediate::Scalar(scalar), Abi::Scalar(s)) => {
|
||||||
assert_eq!(scalar.size(), s.size(cx));
|
assert_eq!(scalar.size(), s.size(cx));
|
||||||
if !matches!(s.primitive(), abi::Pointer(..)) {
|
if !matches!(s.primitive(), abi::Pointer(..)) {
|
||||||
|
// This is not a pointer, it should not carry provenance.
|
||||||
assert!(matches!(scalar, Scalar::Int(..)));
|
assert!(matches!(scalar, Scalar::Int(..)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -655,6 +655,8 @@ where
|
||||||
M::after_local_write(self, local, /*storage_live*/ false)?;
|
M::after_local_write(self, local, /*storage_live*/ false)?;
|
||||||
}
|
}
|
||||||
// Double-check that the value we are storing and the local fit to each other.
|
// Double-check that the value we are storing and the local fit to each other.
|
||||||
|
// Things can ge wrong in quite weird ways when this is violated.
|
||||||
|
// Unfortunately this is too expensive to do in release builds.
|
||||||
if cfg!(debug_assertions) {
|
if cfg!(debug_assertions) {
|
||||||
src.assert_matches_abi(local_layout.abi, self);
|
src.assert_matches_abi(local_layout.abi, self);
|
||||||
}
|
}
|
||||||
|
@ -675,9 +677,9 @@ where
|
||||||
layout: TyAndLayout<'tcx>,
|
layout: TyAndLayout<'tcx>,
|
||||||
dest: MemPlace<M::Provenance>,
|
dest: MemPlace<M::Provenance>,
|
||||||
) -> InterpResult<'tcx> {
|
) -> InterpResult<'tcx> {
|
||||||
if cfg!(debug_assertions) {
|
// We use the sizes from `value` below.
|
||||||
value.assert_matches_abi(layout.abi, self);
|
// Ensure that matches the type of the place it is written to.
|
||||||
}
|
value.assert_matches_abi(layout.abi, self);
|
||||||
// Note that it is really important that the type here is the right one, and matches the
|
// Note that it is really important that the type here is the right one, and matches the
|
||||||
// type things are read at. In case `value` is a `ScalarPair`, we don't do any magic here
|
// type things are read at. In case `value` is a `ScalarPair`, we don't do any magic here
|
||||||
// to handle padding properly, which is only correct if we never look at this data with the
|
// to handle padding properly, which is only correct if we never look at this data with the
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue