(&mut self)
| 189 | } |
| 190 | |
| 191 | pub fn fuzz_loop(&mut self) -> Result<()> { |
| 192 | let mut logger = ProgramLogger::default(); |
| 193 | let initial_combination = rand_choose_combination(rand_comb_len()); |
| 194 | let mut prompt = if let Some(prompt) = load_prompt(&self.deopt) { |
| 195 | prompt |
| 196 | } else { |
| 197 | Prompt::from_combination(initial_combination) |
| 198 | }; |
| 199 | let mut loop_cnt = 0; |
| 200 | let mut has_checked = false; |
| 201 | |
| 202 | self.sync_from_previous_state(&mut logger)?; |
| 203 | |
| 204 | loop { |
| 205 | if self.is_converge() { |
| 206 | break; |
| 207 | } |
| 208 | let programs = self.generate_until_n_success(&mut prompt, &mut logger)?; |
| 209 | let is_stuck = self.is_stuck(programs.len()); |
| 210 | let mut has_new = false; |
| 211 | for mut program in programs { |
| 212 | self.deopt.save_succ_program(&program)?; |
| 213 | let coverage = self.deopt.get_seed_coverage(program.id)?; |
| 214 | let unique_branches = self.observer.has_unique_branch(&coverage); |
| 215 | has_new = !unique_branches.is_empty(); |
| 216 | program.update_quality(unique_branches, &self.deopt)?; |
| 217 | self.deopt.update_seed_queue(program, &coverage, has_new)?; |
| 218 | self.observer.merge_coverage(&coverage); |
| 219 | } |
| 220 | if !get_config().disable_power_schedule { |
| 221 | self.mutate_prompt(&mut prompt)?; |
| 222 | } else { |
| 223 | let new_comb = rand_choose_combination(config::DEFAULT_COMB_LEN); |
| 224 | prompt = Prompt::from_combination(new_comb); |
| 225 | } |
| 226 | |
| 227 | if has_new { |
| 228 | self.quiet_round = 0; |
| 229 | } else if !is_stuck { |
| 230 | self.quiet_round += 1; |
| 231 | } |
| 232 | // As the corpus is also evolved, we recheck the seeds on the evolved corpus to eliminate the error programs that was not catched before. |
| 233 | if self.should_recheck() && !has_checked { |
| 234 | self.executor.recheck_seed(&mut self.deopt)?; |
| 235 | self.observer.recompute_global_coverage()?; |
| 236 | self.deopt.load_programs_from_seeds()?; |
| 237 | has_checked = true; |
| 238 | self.quiet_round = 0; |
| 239 | crate::mutation::prompt_shuffle(&mut prompt); |
| 240 | } |
| 241 | loop_cnt += 1; |
| 242 | logger.reset_round(); |
| 243 | log::info!( |
| 244 | "[Mutate Loop]: loop: {loop_cnt}, quiet_round: {}, {}", |
| 245 | self.quiet_round, |
| 246 | self.observer.dump_global_states() |
| 247 | ); |
| 248 | } |
no test coverage detected