提交 69576fcd 编写于 作者: R Ralf Jung

make ENFORCE_VALIDITY a function

miri needs this extra flexibility
上级 3272c984
...@@ -343,7 +343,11 @@ impl<'a, 'mir, 'tcx> interpret::Machine<'a, 'mir, 'tcx> ...@@ -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 @@ pub(super) fn pop_stack_frame(&mut self) -> EvalResult<'tcx> { ...@@ -524,7 +524,7 @@ pub(super) fn pop_stack_frame(&mut self) -> EvalResult<'tcx> {
} }
// 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 { ...@@ -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 @@ pub fn write_value( ...@@ -607,7 +607,7 @@ pub fn write_value(
) -> 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 @@ pub fn copy_op( ...@@ -729,7 +729,7 @@ pub fn copy_op(
) -> 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 @@ pub fn copy_op_transmute( ...@@ -807,7 +807,7 @@ pub fn copy_op_transmute(
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)?;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册