X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Feval.rs;h=cc5a6eb21fabac1083490440533eda642d9683f7;hb=6fbaa72642dacf92746c695046c8dfe6834ef18f;hp=7a6c562e7ca07b76a9a0a6d362a14917afd62f40;hpb=ffd03b3caaf182a4c0b456cd04c27041e8038aaf;p=rust.git diff --git a/src/eval.rs b/src/eval.rs index 7a6c562e7ca..cc5a6eb21fa 100644 --- a/src/eval.rs +++ b/src/eval.rs @@ -5,6 +5,7 @@ use rand::rngs::StdRng; use rand::SeedableRng; +use log::info; use rustc_hir::def_id::DefId; use rustc_middle::ty::{self, layout::LayoutCx, TyCtxt}; @@ -31,8 +32,10 @@ pub struct MiriConfig { pub args: Vec, /// The seed to use when non-determinism or randomness are required (e.g. ptr-to-int cast, `getrandom()`). pub seed: Option, - /// The stacked borrow id to report about + /// The stacked borrows pointer id to report about pub tracked_pointer_tag: Option, + /// The stacked borrows call ID to report about + pub tracked_call_id: Option, /// The allocation id to report about. pub tracked_alloc_id: Option, } @@ -49,6 +52,7 @@ fn default() -> MiriConfig { args: vec![], seed: None, tracked_pointer_tag: None, + tracked_call_id: None, tracked_alloc_id: None, } } @@ -63,17 +67,18 @@ pub fn create_ecx<'mir, 'tcx: 'mir>( main_id: DefId, config: MiriConfig, ) -> InterpResult<'tcx, (InterpCx<'mir, 'tcx, Evaluator<'mir, 'tcx>>, MPlaceTy<'tcx, Tag>)> { - let tcx_at = tcx.at(rustc_span::source_map::DUMMY_SP); let param_env = ty::ParamEnv::reveal_all(); let layout_cx = LayoutCx { tcx, param_env }; let mut ecx = InterpCx::new( - tcx_at, + tcx, + rustc_span::source_map::DUMMY_SP, param_env, Evaluator::new(config.communicate, config.validate, layout_cx), MemoryExtra::new( StdRng::seed_from_u64(config.seed.unwrap_or(0)), config.stacked_borrows, config.tracked_pointer_tag, + config.tracked_call_id, config.tracked_alloc_id, config.check_alignment, ), @@ -191,8 +196,8 @@ pub fn create_ecx<'mir, 'tcx: 'mir>( /// Returns `Some(return_code)` if program executed completed. /// Returns `None` if an evaluation error occured. pub fn eval_main<'tcx>(tcx: TyCtxt<'tcx>, main_id: DefId, config: MiriConfig) -> Option { - // FIXME: on Windows, we ignore leaks (https://github.com/rust-lang/miri/issues/1302). - let ignore_leaks = config.ignore_leaks || tcx.sess.target.target.target_os == "windows"; + // Copy setting before we move `config`. + let ignore_leaks = config.ignore_leaks; let (mut ecx, ret_place) = match create_ecx(tcx, main_id, config) { Ok(v) => v, @@ -206,6 +211,7 @@ pub fn eval_main<'tcx>(tcx: TyCtxt<'tcx>, main_id: DefId, config: MiriConfig) -> let res: InterpResult<'_, i64> = (|| { // Main loop. loop { + let info = ecx.preprocess_diagnostics(); match ecx.schedule()? { SchedulingAction::ExecuteStep => { assert!(ecx.step()?, "a terminated thread was scheduled for execution"); @@ -226,9 +232,9 @@ pub fn eval_main<'tcx>(tcx: TyCtxt<'tcx>, main_id: DefId, config: MiriConfig) -> break; } } - ecx.process_diagnostics(); + ecx.process_diagnostics(info); } - let return_code = ecx.read_scalar(ret_place.into())?.not_undef()?.to_machine_isize(&ecx)?; + let return_code = ecx.read_scalar(ret_place.into())?.check_init()?.to_machine_isize(&ecx)?; Ok(return_code) })(); @@ -239,7 +245,8 @@ pub fn eval_main<'tcx>(tcx: TyCtxt<'tcx>, main_id: DefId, config: MiriConfig) -> match res { Ok(return_code) => { if !ignore_leaks { - let leaks = ecx.memory.leak_report(); + info!("Additonal static roots: {:?}", ecx.machine.static_roots); + let leaks = ecx.memory.leak_report(&ecx.machine.static_roots); if leaks != 0 { tcx.sess.err("the evaluated program leaked memory"); // Ignore the provided return code - let the reported error