use rand::rngs::StdRng;
use rand::SeedableRng;
+use log::info;
use rustc_hir::def_id::DefId;
use rustc_middle::ty::{self, layout::LayoutCx, TyCtxt};
/// 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<i64> {
- // 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,
let res: InterpResult<'_, i64> = (|| {
// Main loop.
loop {
+ let info = ecx.preprocess_diagnostics();
match ecx.schedule()? {
SchedulingAction::ExecuteStep => {
- let info = ecx.preprocess_diagnostics();
assert!(ecx.step()?, "a terminated thread was scheduled for execution");
- ecx.process_diagnostics(info);
}
SchedulingAction::ExecuteTimeoutCallback => {
assert!(ecx.machine.communicate,
break;
}
}
+ 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)
})();
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