From 8093a59ffb0318ab315a6386cfe76e6a595a313e Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Sun, 30 Jun 2019 23:28:24 +0200 Subject: [PATCH] move gen_random to helpers --- src/helpers.rs | 36 ++++++++++++++++++++++++++++++++++++ src/shims/foreign_items.rs | 35 ----------------------------------- 2 files changed, 36 insertions(+), 35 deletions(-) diff --git a/src/helpers.rs b/src/helpers.rs index 3503af43690..b2be90ca999 100644 --- a/src/helpers.rs +++ b/src/helpers.rs @@ -3,6 +3,8 @@ use rustc::ty::{self, layout::{self, Size}}; use rustc::hir::def_id::{DefId, CRATE_DEF_INDEX}; +use rand::RngCore; + use crate::*; impl<'mir, 'tcx> EvalContextExt<'mir, 'tcx> for crate::MiriEvalContext<'mir, 'tcx> {} @@ -65,6 +67,40 @@ fn test_null(&self, val: Scalar) -> InterpResult<'tcx, Option>> }) } + /// Generate some random bytes, and write them to `dest`. + fn gen_random( + &mut self, + len: usize, + dest: Scalar, + ) -> InterpResult<'tcx> { + if len == 0 { + // Nothing to do + return Ok(()); + } + let this = self.eval_context_mut(); + let ptr = dest.to_ptr()?; + + let data = match &mut this.memory_mut().extra.rng { + Some(rng) => { + let mut rng = rng.borrow_mut(); + let mut data = vec![0; len]; + rng.fill_bytes(&mut data); + data + } + None => { + return err!(Unimplemented( + "miri does not support gathering system entropy in deterministic mode! + Use '-Zmiri-seed=' to enable random number generation. + WARNING: Miri does *not* generate cryptographically secure entropy - + do not use Miri to run any program that needs secure random number generation".to_owned(), + )); + } + }; + let tcx = &{this.tcx.tcx}; + this.memory_mut().get_mut(ptr.alloc_id)? + .write_bytes(tcx, ptr, &data) + } + /// Visits the memory covered by `place`, sensitive to freezing: the 3rd parameter /// will be true if this is frozen, false if this is in an `UnsafeCell`. fn visit_freeze_sensitive( diff --git a/src/shims/foreign_items.rs b/src/shims/foreign_items.rs index e31a34a6015..7ab97c87e30 100644 --- a/src/shims/foreign_items.rs +++ b/src/shims/foreign_items.rs @@ -4,8 +4,6 @@ use syntax::attr; use syntax::symbol::sym; -use rand::RngCore; - use crate::*; impl<'mir, 'tcx> EvalContextExt<'mir, 'tcx> for crate::MiriEvalContext<'mir, 'tcx> {} @@ -986,37 +984,4 @@ fn eval_path_scalar(&mut self, path: &[&str]) -> InterpResult<'tcx, Option, - ) -> InterpResult<'tcx> { - if len == 0 { - // Nothing to do - return Ok(()); - } - let this = self.eval_context_mut(); - let ptr = dest.to_ptr()?; - - let data = match &mut this.memory_mut().extra.rng { - Some(rng) => { - let mut rng = rng.borrow_mut(); - let mut data = vec![0; len]; - rng.fill_bytes(&mut data); - data - } - None => { - return err!(Unimplemented( - "miri does not support gathering system entropy in deterministic mode! - Use '-Zmiri-seed=' to enable random number generation. - WARNING: Miri does *not* generate cryptographically secure entropy - - do not use Miri to run any program that needs secure random number generation".to_owned(), - )); - } - }; - let tcx = &{this.tcx.tcx}; - this.memory_mut().get_mut(ptr.alloc_id)? - .write_bytes(tcx, ptr, &data) - } } \ No newline at end of file -- 2.44.0