22
33use example_crossover:: sum;
44use libfuzzer_sys:: { fuzz_crossover, fuzz_mutator, fuzz_target} ;
5- use rand:: distributions :: { Bernoulli , Distribution , Uniform } ;
6- use rand:: { rngs:: StdRng , seq:: SliceRandom , SeedableRng } ;
5+ use rand:: distr :: { Bernoulli , Distribution , Uniform } ;
6+ use rand:: { rngs:: SmallRng , seq:: SliceRandom , Rng , SeedableRng } ;
77use std:: mem:: size_of;
88
99fuzz_target ! ( |data: & [ u8 ] | {
@@ -17,8 +17,8 @@ fuzz_target!(|data: &[u8]| {
1717 ) ;
1818} ) ;
1919
20- fn rfp ( rng : & mut StdRng ) -> f64 {
21- match Uniform :: new_inclusive ( 0 , 10 ) . sample ( rng) {
20+ fn rfp < T : Rng > ( rng : & mut T ) -> f64 {
21+ match Uniform :: new_inclusive ( 0 , 10 ) . unwrap ( ) . sample ( rng) {
2222 0 => f64:: NAN ,
2323 1 => f64:: MIN ,
2424 2 => f64:: MAX ,
@@ -29,24 +29,24 @@ fn rfp(rng: &mut StdRng) -> f64 {
2929 7 => f64:: INFINITY ,
3030 8 => f64:: NEG_INFINITY ,
3131 9 => 0.0 ,
32- 10 => Uniform :: new_inclusive ( -1.0 , 1.0 ) . sample ( rng) ,
32+ 10 => Uniform :: new_inclusive ( -1.0 , 1.0 ) . unwrap ( ) . sample ( rng) ,
3333 _ => 0.0 ,
3434 }
3535}
3636
3737fuzz_mutator ! ( |data: & mut [ u8 ] , size: usize , max_size: usize , seed: u32 | {
38- let mut gen = StdRng :: seed_from_u64( seed. into( ) ) ;
38+ let mut rng = SmallRng :: seed_from_u64( seed. into( ) ) ;
3939
40- match Uniform :: new_inclusive( 0 , 3 ) . sample( & mut gen ) {
40+ match Uniform :: new_inclusive( 0 , 3 ) . unwrap ( ) . sample( & mut rng ) {
4141 0 => {
4242 // "Change [an] element"
4343
4444 // Not altering the size, so decode the intended space (i.e. `size`) as floats
4545 let ( _, floats, _) = unsafe { data[ ..size] . align_to_mut:: <f64 >( ) } ;
4646
4747 if !floats. is_empty( ) {
48- let d = Uniform :: new( 0 , floats. len( ) ) ;
49- floats[ d. sample( & mut gen ) ] = rfp( & mut gen ) ;
48+ let d = Uniform :: new( 0 , floats. len( ) ) . unwrap ( ) ;
49+ floats[ d. sample( & mut rng ) ] = rfp( & mut rng ) ;
5050 }
5151 }
5252 1 => {
@@ -58,7 +58,7 @@ fuzz_mutator!(|data: &mut [u8], size: usize, max_size: usize, seed: u32| {
5858 let ( _, floats, _) = unsafe { data[ ..plus_one] . align_to_mut:: <f64 >( ) } ;
5959
6060 let last = floats. last_mut( ) . unwrap( ) ;
61- * last = rfp( & mut gen ) ;
61+ * last = rfp( & mut rng ) ;
6262
6363 return plus_one;
6464 }
@@ -79,7 +79,7 @@ fuzz_mutator!(|data: &mut [u8], size: usize, max_size: usize, seed: u32| {
7979
8080 // Not altering the size, so decode the intended space (i.e. `size`) as floats
8181 let ( _, floats, _) = unsafe { data[ ..size] . align_to_mut:: <f64 >( ) } ;
82- floats. shuffle( & mut gen ) ;
82+ floats. shuffle( & mut rng ) ;
8383 }
8484 _ => unreachable!( ) ,
8585 } ;
@@ -88,7 +88,7 @@ fuzz_mutator!(|data: &mut [u8], size: usize, max_size: usize, seed: u32| {
8888} ) ;
8989
9090fuzz_crossover ! ( |data1: & [ u8 ] , data2: & [ u8 ] , out: & mut [ u8 ] , seed: u32 | {
91- let mut gen = StdRng :: seed_from_u64( seed. into( ) ) ;
91+ let mut rng = SmallRng :: seed_from_u64( seed. into( ) ) ;
9292
9393 let bd = Bernoulli :: new( 0.5 ) . unwrap( ) ;
9494
@@ -113,7 +113,7 @@ fuzz_crossover!(|data1: &[u8], data2: &[u8], out: &mut [u8], seed: u32| {
113113 // Put into the destination, floats from either data1 or data2 if the
114114 // Bernoulli distribution succeeds or fails
115115 for i in 0 ..n {
116- out_floats[ i] = if bd. sample( & mut gen ) {
116+ out_floats[ i] = if bd. sample( & mut rng ) {
117117 d1_floats[ i]
118118 } else {
119119 d2_floats[ i]
0 commit comments