Skip to content

Commit 164f410

Browse files
committed
worker: fix initial corpus load logic
1 parent 20275cd commit 164f410

4 files changed

Lines changed: 26 additions & 10 deletions

File tree

src/cli/concolic_explore.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -290,7 +290,7 @@ impl<'a> ConcolicExplorer<'a> {
290290
let mut submitted = HashSet::default();
291291
let mut i = 0;
292292
let mut skip = 0;
293-
for (precond_event, precond_inputs) in trace.events[..event_idx]
293+
for (precond_event, _precond_inputs) in trace.events[..event_idx]
294294
.iter()
295295
.zip(trace.event_inputs[..event_idx].iter())
296296
.rev()

src/cli/mod.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -711,6 +711,8 @@ pub(crate) fn main() {
711711
#[cfg(feature = "reports")]
712712
crate::cli::cov_html::write_html_cov_report(mod_spec, &sess, &out_path);
713713
#[cfg(not(feature = "reports"))]
714+
let _ = out_path;
715+
#[cfg(not(feature = "reports"))]
714716
panic!("trying to write html report without 'reports' feature")
715717
}
716718
}
@@ -809,9 +811,7 @@ pub(crate) fn main() {
809811
for (file_idx, file) in report_info.files.iter().enumerate() {
810812
for line_idx in file.line_coverage.covered.iter_ones() {
811813
let key = (file_idx, line_idx);
812-
if !blame.map.contains_key(&key) {
813-
blame.map.insert(key, inp_idx);
814-
}
814+
blame.map.entry(key).or_insert(inp_idx);
815815
}
816816
}
817817
}

src/fuzzer/worker.rs

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -132,28 +132,40 @@ impl Worker {
132132
worker.sess.reset_pass_coverage();
133133
worker.sess.initialize(&mut worker.stats);
134134
eprintln!("running orc's inputs ...");
135+
let mut discarded_input_size = 0;
136+
let mut interesting_inputs = 0;
137+
let orc_input_count = corpus.len();
135138
for input in corpus {
136139
if input.len() > worker.sess.swarm.input_alloc_size() {
140+
discarded_input_size += 1;
137141
continue;
138142
}
139143
// NOTE: we don't need to trace here if we're going to throw them away anyways!
140-
let res = worker.on_corpus(&input, false);
144+
let res = worker.on_corpus(&input, true);
141145
if matches!(res, Err(_) | Ok(InputVerdict::Crashed)) {
146+
eprintln!("Worker::new crashed on corpus entry: {:?}", res);
142147
break;
143148
}
149+
interesting_inputs += matches!(res, Ok(InputVerdict::Interesting)) as usize;
144150
}
151+
if discarded_input_size > 0 {
152+
eprintln!("discarded {discarded_input_size} inputs due to size limit");
153+
}
154+
eprintln!("interesting inputs: {interesting_inputs}/{orc_input_count}");
145155
eprintln!(
146-
"after fetch_corpus: {} edges",
147-
worker.sess.get_edge_cov().unwrap_or(0)
156+
"after fetch_corpus: {} edges, {} inputs",
157+
worker.sess.get_edge_cov().unwrap_or(0),
158+
worker.corpus.count()
148159
);
149160
for _ in 0..10 {
150161
if !worker.inmemory_cmin(false) {
151162
break;
152163
}
153164
}
154165
eprintln!(
155-
"after inmem_cmin: {} edges",
156-
worker.sess.get_edge_cov().unwrap_or(0)
166+
"after inmem_cmin: {} edges, {} inputs",
167+
worker.sess.get_edge_cov().unwrap_or(0),
168+
worker.corpus.count()
157169
);
158170
}
159171
}
@@ -165,6 +177,8 @@ impl Worker {
165177
fn on_corpus(&mut self, input: &[u8], is_seed: bool) -> Result<InputVerdict, libafl::Error> {
166178
tracy_full::zone!("Worker::on_corpus");
167179
let ignore_crashes = *self.opts.x.fuzz_through_crashes;
180+
181+
let mut was_interesting = false;
168182
if !*self.opts.x.run_from_snapshot {
169183
let res = self.sess.run_reusable(input, false, &mut self.stats);
170184
if res.is_crash() && !ignore_crashes {
@@ -174,6 +188,7 @@ impl Worker {
174188
if is_seed && !res.novel_coverage {
175189
return Ok(InputVerdict::NotInteresting);
176190
}
191+
was_interesting = res.novel_coverage;
177192
}
178193

179194
// make sure we catch inputs that crash on fresh instances but not on used ones (TODO?)
@@ -183,7 +198,7 @@ impl Worker {
183198
return Ok(InputVerdict::Crashed);
184199
}
185200

186-
if !res.novel_coverage {
201+
if !res.novel_coverage && !was_interesting {
187202
return Ok(InputVerdict::NotInteresting);
188203
}
189204

src/instrumentation/code_coverage.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ impl<K: Ord + Clone> CoverageBitset<K> {
8484
self.saved.iter_ones().map(|i| self.keys[i].clone())
8585
}
8686

87+
#[allow(unused)]
8788
pub(crate) fn saved_val(&self, key: &K) -> bool {
8889
let index = self.keys.binary_search(key).unwrap();
8990
self.saved[index]

0 commit comments

Comments
 (0)