MCPcopy Create free account
hub / github.com/MultiFuzz/MultiFuzz / extend_input_by

Function extend_input_by

hail-fuzz/src/mutations.rs:71–118  ·  view source on GitHub ↗
(
    rng: &mut R,
    dict: DictionaryRef,
    bytes: &mut Vec<u8>,
    amount: usize,
)

Source from the content-addressed store, hash-verified

69];
70
71pub(crate) fn extend_input_by<R: Rng>(
72 rng: &mut R,
73 dict: DictionaryRef,
74 bytes: &mut Vec<u8>,
75 amount: usize,
76) -> Extension {
77 let new_len = bytes.len() + amount;
78 let kind = *ALL_EXTENSIONS.choose(rng).unwrap();
79 match kind {
80 Extension::Interesting => {
81 let value = INTERESTING_VALUES.choose(rng).unwrap();
82 while bytes.len() < new_len {
83 bytes.extend_from_slice(value);
84 }
85 }
86 Extension::Prev if bytes.len() > 2 => {
87 while bytes.len() < new_len {
88 bytes.extend_from_within(rand_range(rng, 0, bytes.len(), amount));
89 }
90 }
91 Extension::PrevRepeat if bytes.len() > 2 => {
92 let range = rand_range(rng, 0, bytes.len(), amount);
93 while bytes.len() < new_len {
94 bytes.extend_from_within(range.clone());
95 }
96 }
97 Extension::Dict => {
98 while bytes.len() < new_len {
99 let (value, strides) = dict.choose(rng);
100 let stride = random_stride(rng, strides);
101 bytes.extend(value.iter().flat_map(|x| std::iter::repeat(x).take(stride)));
102 }
103 }
104 Extension::DictRepeat => {
105 let (value, strides) = dict.choose(rng);
106 let stride = random_stride(rng, strides);
107 while bytes.len() < new_len {
108 bytes.extend(value.iter().flat_map(|x| std::iter::repeat(x).take(stride)));
109 }
110 }
111 Extension::Random | _ => {
112 for _ in 0..amount {
113 bytes.push(rng.gen());
114 }
115 }
116 }
117 kind
118}
119
120#[derive(Copy, Clone, Debug, serde::Serialize, serde::Deserialize)]
121pub enum Mutation {

Callers 2

extend_input_by_randFunction · 0.85
fuzz_oneMethod · 0.85

Calls 6

rand_rangeFunction · 0.85
random_strideFunction · 0.85
chooseMethod · 0.80
cloneMethod · 0.80
takeMethod · 0.80
lenMethod · 0.45

Tested by

no test coverage detected