transform the programs be more exploitable. transform all array/scalar arguments be fuzzable and consider their constraints.
(&mut self)
| 152 | // transform the programs be more exploitable. |
| 153 | // transform all array/scalar arguments be fuzzable and consider their constraints. |
| 154 | fn exploit_transform(&mut self) -> Result<()> { |
| 155 | log::info!("Transform the correct programs to fuzzers with Constraints!"); |
| 156 | if crate::program::infer::load_constraints(&self.deopt).is_err() { |
| 157 | let succ_programs = |
| 158 | crate::deopt::utils::read_sort_dir(&self.deopt.get_library_succ_seed_dir()?)?; |
| 159 | self.init_corpus_before_constraint_infer(&succ_programs)?; |
| 160 | crate::program::infer::infer_constraints(&succ_programs, &self.deopt)?; |
| 161 | } |
| 162 | |
| 163 | let core = max_cpu_count(); |
| 164 | |
| 165 | let mut test_corpus = vec![]; |
| 166 | let mut new_programs = vec![]; |
| 167 | for program in self.programs.iter() { |
| 168 | if let Ok(corpora) = find_testbed_corpora(program, &self.deopt) { |
| 169 | test_corpus.push(corpora); |
| 170 | new_programs.push(program.to_path_buf()); |
| 171 | } else { |
| 172 | log::error!("Failed to find testbed corpora for program: {program:?}, skip it and continue..."); |
| 173 | } |
| 174 | } |
| 175 | self.programs = new_programs; |
| 176 | |
| 177 | let executor = Executor::default(); |
| 178 | let mut tasks = Vec::new(); |
| 179 | let mut task_corpus = Vec::new(); |
| 180 | for (i, program) in self.programs.iter().enumerate() { |
| 181 | let corpora = &test_corpus[i]; |
| 182 | let i = i + 1; |
| 183 | tasks.push(program.clone()); |
| 184 | task_corpus.push(corpora.to_path_buf()); |
| 185 | |
| 186 | if i % core == 0 || i == self.programs.len() { |
| 187 | executor.concurrent_transform(&tasks, core, true, &task_corpus)?; |
| 188 | tasks.clear(); |
| 189 | task_corpus.clear(); |
| 190 | log::debug!("transformed {i}/{}", self.programs.len()); |
| 191 | } |
| 192 | } |
| 193 | Ok(()) |
| 194 | } |
| 195 | |
| 196 | pub fn synthesis(&mut self) -> Result<()> { |
| 197 | log::info!("synthesis huge fuzzers!"); |
no test coverage detected