make ENFORCE_VALIDITY a function
miri needs this extra flexibility
This commit is contained in:
parent
3272c9845c
commit
69576fcdee
@ -343,7 +343,11 @@ impl<'a, 'mir, 'tcx> interpret::Machine<'a, 'mir, 'tcx>
|
|||||||
type MemoryMap = FxHashMap<AllocId, (MemoryKind<!>, Allocation<()>)>;
|
type MemoryMap = FxHashMap<AllocId, (MemoryKind<!>, Allocation<()>)>;
|
||||||
|
|
||||||
const STATIC_KIND: Option<!> = None; // no copying of statics allowed
|
const STATIC_KIND: Option<!> = None; // no copying of statics allowed
|
||||||
const ENFORCE_VALIDITY: bool = false; // for now, we don't
|
|
||||||
|
#[inline(always)]
|
||||||
|
fn enforce_validity(_ecx: &EvalContext<'a, 'mir, 'tcx, Self>) -> bool {
|
||||||
|
false // for now, we don't enforce validity
|
||||||
|
}
|
||||||
|
|
||||||
fn find_fn(
|
fn find_fn(
|
||||||
ecx: &mut EvalContext<'a, 'mir, 'tcx, Self>,
|
ecx: &mut EvalContext<'a, 'mir, 'tcx, Self>,
|
||||||
|
@ -524,7 +524,7 @@ impl<'a, 'mir, 'tcx: 'mir, M: Machine<'a, 'mir, 'tcx>> EvalContext<'a, 'mir, 'tc
|
|||||||
}
|
}
|
||||||
// Validate the return value.
|
// Validate the return value.
|
||||||
if let Some(return_place) = frame.return_place {
|
if let Some(return_place) = frame.return_place {
|
||||||
if M::ENFORCE_VALIDITY {
|
if M::enforce_validity(self) {
|
||||||
// Data got changed, better make sure it matches the type!
|
// Data got changed, better make sure it matches the type!
|
||||||
// It is still possible that the return place held invalid data while
|
// It is still possible that the return place held invalid data while
|
||||||
// the function is running, but that's okay because nobody could have
|
// the function is running, but that's okay because nobody could have
|
||||||
|
@ -86,7 +86,7 @@ pub trait Machine<'a, 'mir, 'tcx>: Sized {
|
|||||||
const STATIC_KIND: Option<Self::MemoryKinds>;
|
const STATIC_KIND: Option<Self::MemoryKinds>;
|
||||||
|
|
||||||
/// Whether to enforce the validity invariant
|
/// Whether to enforce the validity invariant
|
||||||
const ENFORCE_VALIDITY: bool;
|
fn enforce_validity(ecx: &EvalContext<'a, 'mir, 'tcx, Self>) -> bool;
|
||||||
|
|
||||||
/// Called before a basic block terminator is executed.
|
/// Called before a basic block terminator is executed.
|
||||||
/// You can use this to detect endlessly running programs.
|
/// You can use this to detect endlessly running programs.
|
||||||
|
@ -607,7 +607,7 @@ where
|
|||||||
) -> EvalResult<'tcx> {
|
) -> EvalResult<'tcx> {
|
||||||
self.write_value_no_validate(src_val, dest)?;
|
self.write_value_no_validate(src_val, dest)?;
|
||||||
|
|
||||||
if M::ENFORCE_VALIDITY {
|
if M::enforce_validity(self) {
|
||||||
// Data got changed, better make sure it matches the type!
|
// Data got changed, better make sure it matches the type!
|
||||||
self.validate_operand(self.place_to_op(dest)?, &mut vec![], None, /*const_mode*/false)?;
|
self.validate_operand(self.place_to_op(dest)?, &mut vec![], None, /*const_mode*/false)?;
|
||||||
}
|
}
|
||||||
@ -729,7 +729,7 @@ where
|
|||||||
) -> EvalResult<'tcx> {
|
) -> EvalResult<'tcx> {
|
||||||
self.copy_op_no_validate(src, dest)?;
|
self.copy_op_no_validate(src, dest)?;
|
||||||
|
|
||||||
if M::ENFORCE_VALIDITY {
|
if M::enforce_validity(self) {
|
||||||
// Data got changed, better make sure it matches the type!
|
// Data got changed, better make sure it matches the type!
|
||||||
self.validate_operand(self.place_to_op(dest)?, &mut vec![], None, /*const_mode*/false)?;
|
self.validate_operand(self.place_to_op(dest)?, &mut vec![], None, /*const_mode*/false)?;
|
||||||
}
|
}
|
||||||
@ -807,7 +807,7 @@ where
|
|||||||
PlaceTy::from(MPlaceTy { mplace: *dest, layout: src.layout }),
|
PlaceTy::from(MPlaceTy { mplace: *dest, layout: src.layout }),
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
if M::ENFORCE_VALIDITY {
|
if M::enforce_validity(self) {
|
||||||
// Data got changed, better make sure it matches the type!
|
// Data got changed, better make sure it matches the type!
|
||||||
self.validate_operand(dest.into(), &mut vec![], None, /*const_mode*/false)?;
|
self.validate_operand(dest.into(), &mut vec![], None, /*const_mode*/false)?;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user