about summary refs log tree commit diff
path: root/src/libstd
diff options
context:
space:
mode:
authorHuon Wilson <dbau.pp+github@gmail.com>2013-10-22 23:11:17 +1100
committerHuon Wilson <dbau.pp+github@gmail.com>2013-10-23 11:50:45 +1100
commit6e7bbdacb9bf04c1f5bf2c3aad487122d8377b7f (patch)
tree99ea846bbbe2031015ecd3d847761b63df503d14 /src/libstd
parentb8932c6304599bddec6ac6d916db72a5c4034ada (diff)
downloadrust-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.rs23
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
     }