MCPcopy Create free account
hub / github.com/FuzzAnything/PromptFuzz / fuzz_loop

Method fuzz_loop

src/fuzzer.rs:191–252  ·  view source on GitHub ↗
(&mut self)

Source from the content-addressed store, hash-verified

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 }

Callers 1

mainFunction · 0.80

Calls 15

rand_choose_combinationFunction · 0.85
rand_comb_lenFunction · 0.85
load_promptFunction · 0.85
get_configFunction · 0.85
prompt_shuffleFunction · 0.85
minimizeFunction · 0.85
is_convergeMethod · 0.80
is_stuckMethod · 0.80
save_succ_programMethod · 0.80
get_seed_coverageMethod · 0.80

Tested by

no test coverage detected