diff options
| author | Huon Wilson <dbau.pp+github@gmail.com> | 2013-10-22 23:11:17 +1100 |
|---|---|---|
| committer | Huon Wilson <dbau.pp+github@gmail.com> | 2013-10-23 11:50:45 +1100 |
| commit | 6e7bbdacb9bf04c1f5bf2c3aad487122d8377b7f (patch) | |
| tree | 99ea846bbbe2031015ecd3d847761b63df503d14 /src/libstd | |
| parent | b8932c6304599bddec6ac6d916db72a5c4034ada (diff) | |
| download | rust-6e7bbdacb9bf04c1f5bf2c3aad487122d8377b7f.tar.gz rust-6e7bbdacb9bf04c1f5bf2c3aad487122d8377b7f.zip | |
std::rand: seed ISAAC with no transmutes.
Slice transmutes are now (and, really, always were) dangerous, so we avoid them and do the (only?) non-(undefined behaviour in C) pointer cast: casting to *u8.
Diffstat (limited to 'src/libstd')
| -rw-r--r-- | src/libstd/rand/isaac.rs | 23 |
1 files changed, 16 insertions, 7 deletions
diff --git a/src/libstd/rand/isaac.rs b/src/libstd/rand/isaac.rs index 22117eebd29..7dc4e5b868b 100644 --- a/src/libstd/rand/isaac.rs +++ b/src/libstd/rand/isaac.rs @@ -10,10 +10,11 @@ //! The ISAAC random number generator. -use cast; use rand::{Rng, SeedableRng, OSRng}; use iter::{Iterator, range, range_step, Repeat}; use option::{None, Some}; +use vec::raw; +use mem; static RAND_SIZE_LEN: u32 = 8; static RAND_SIZE: u32 = 1 << RAND_SIZE_LEN; @@ -42,9 +43,12 @@ impl IsaacRng { pub fn new() -> IsaacRng { let mut rng = EMPTY; - { - let bytes = unsafe {cast::transmute::<&mut [u32], &mut [u8]>(rng.rsl)}; - OSRng::new().fill_bytes(bytes); + unsafe { + let ptr = raw::to_mut_ptr(rng.rsl); + + do raw::mut_buf_as_slice(ptr as *mut u8, mem::size_of_val(&rng.rsl)) |slice| { + OSRng::new().fill_bytes(slice); + } } rng.init(true); @@ -238,10 +242,15 @@ impl Isaac64Rng { /// seed. pub fn new() -> Isaac64Rng { let mut rng = EMPTY_64; - { - let bytes = unsafe {cast::transmute::<&mut [u64], &mut [u8]>(rng.rsl)}; - OSRng::new().fill_bytes(bytes); + + unsafe { + let ptr = raw::to_mut_ptr(rng.rsl); + + do raw::mut_buf_as_slice(ptr as *mut u8, mem::size_of_val(&rng.rsl)) |slice| { + OSRng::new().fill_bytes(slice); + } } + rng.init(true); rng } |
