| 13 | }; |
| 14 | |
| 15 | pub(crate) struct MultiStreamExtendStage { |
| 16 | /// The different addresses that the program has finished executing at, used for discovering |
| 17 | /// new inputs for further mutations. |
| 18 | end_addrs: HashSet<u64>, |
| 19 | |
| 20 | /// The rarest ending address seen for the current input. |
| 21 | rare_input: Option<(u64, MultiStream)>, |
| 22 | |
| 23 | /// Inputs that we found that end with new mmio address. |
| 24 | new_starting_inputs: VecDeque<(u32, MultiStream)>, |
| 25 | |
| 26 | /// The input we are extending. |
| 27 | current_input: MultiStream, |
| 28 | |
| 29 | /// The number of inputs that we fuzzed in order to reach `current_input`. |
| 30 | local_depth: u32, |
| 31 | |
| 32 | /// The maximum number of extensions to apply per stream. |
| 33 | log2_max_extensions: u32, |
| 34 | |
| 35 | /// The set of streams that have been observed to be read after `current_input` |
| 36 | streams_to_mutate: HashMap<StreamKey, f64>, |
| 37 | |
| 38 | /// Data used for input-to-state random replacement. |
| 39 | i2s_data: Option<i2s::I2SRandomReplacement>, |
| 40 | |
| 41 | /// The number of remaining attempts when to try i2s random replacement for. |
| 42 | i2s_replacement_attempts: i32, |
| 43 | |
| 44 | /// The amount of energy assigned to this input. |
| 45 | energy: usize, |
| 46 | |
| 47 | /// The remaining attempts to try for the current input. |
| 48 | attempts: usize, |
| 49 | extension_limit: usize, |
| 50 | } |
| 51 | |
| 52 | impl MultiStreamExtendStage { |
| 53 | fn start(fuzzer: &mut Fuzzer) -> Result<Self, StageExit> { |
nothing calls this directly
no outgoing calls
no test coverage detected