diff --git a/src/librand/isaac.rs b/src/librand/isaac.rs index 0f7cda42a8a..871328e9c16 100644 --- a/src/librand/isaac.rs +++ b/src/librand/isaac.rs @@ -185,7 +185,19 @@ impl Rng for IsaacRng { self.isaac(); } self.cnt -= 1; - self.rsl[self.cnt as uint] + + // self.cnt is at most RAND_SIZE, but that is before the + // subtraction above. We want to index without bounds + // checking, but this could lead to incorrect code if someone + // misrefactors, so we check, sometimes. + // + // (Changes here should be reflected in Isaac64Rng.next_u64.) + debug_assert!(self.cnt < RAND_SIZE); + + // (the % is cheaply telling the optimiser that we're always + // in bounds, without unsafe. NB. this is a power of two, so + // it optimises to a bitwise mask). + self.rsl[(self.cnt % RAND_SIZE) as uint] } } @@ -416,7 +428,11 @@ impl Rng for Isaac64Rng { self.isaac64(); } self.cnt -= 1; - unsafe { *self.rsl.unsafe_get(self.cnt) } + + // See corresponding location in IsaacRng.next_u32 for + // explanation. + debug_assert!(self.cnt < RAND_SIZE_64) + self.rsl[(self.cnt % RAND_SIZE_64) as uint] } }