(
&mut self,
prompt: &mut Prompt,
logger: &mut ProgramLogger,
)
| 105 | } |
| 106 | |
| 107 | pub fn generate_until_n_success( |
| 108 | &mut self, |
| 109 | prompt: &mut Prompt, |
| 110 | logger: &mut ProgramLogger, |
| 111 | ) -> Result<Vec<Program>> { |
| 112 | log::trace!( |
| 113 | "Generate until {} sucess programs", |
| 114 | get_config().fuzz_round_succ |
| 115 | ); |
| 116 | let mut succ_programs = Vec::new(); |
| 117 | |
| 118 | while succ_programs.len() < get_config().fuzz_round_succ { |
| 119 | let mut programs = self.handler.generate(prompt)?; |
| 120 | if programs.is_empty() { |
| 121 | log::warn!("LLM did not generate any program, retrying..."); |
| 122 | continue; |
| 123 | } |
| 124 | for program in &mut programs { |
| 125 | program.id = self.deopt.inc_seed_id(); |
| 126 | } |
| 127 | |
| 128 | log::debug!( |
| 129 | "LLM generated {} programs. Sanitize those programs!", |
| 130 | programs.len() |
| 131 | ); |
| 132 | let check_res = self |
| 133 | .executor |
| 134 | .check_programs_are_correct(&programs, &self.deopt)?; |
| 135 | // Check each generated programs, and save thems according where they contains errors. |
| 136 | for (i, program) in programs.iter().enumerate() { |
| 137 | let has_err = check_res |
| 138 | .get(i) |
| 139 | .unwrap_or_else(|| panic!("cannot obtain check_res at `{i}`")); |
| 140 | // save as error programs |
| 141 | if let Some(err_msg) = has_err { |
| 142 | self.deopt.save_err_program(program, err_msg)?; |
| 143 | logger.log_err(err_msg); |
| 144 | } else { |
| 145 | succ_programs.push(program.clone()); |
| 146 | logger.log_succ(); |
| 147 | } |
| 148 | } |
| 149 | logger.print_succ_round(); |
| 150 | // if the combiantion continusely failed in a long time, shuffle the prompt to escape the bad combination; |
| 151 | if self |
| 152 | .schedule |
| 153 | .should_shuffle(logger.get_rc_succ(), logger.get_rc_total()) |
| 154 | { |
| 155 | log::info!("Fuzzer stuck in the current prompt, choose a new one."); |
| 156 | break; |
| 157 | } |
| 158 | } |
| 159 | Ok(succ_programs) |
| 160 | } |
| 161 | |
| 162 | fn mutate_prompt(&mut self, prompt: &mut Prompt) -> Result<()> { |
| 163 | let api_coverage = self.observer.compute_library_api_coverage()?; |
no test coverage detected