Skip to content

Commit cd402f7

Browse files
authored
Add option to clear basic block history after each flush in DrCovModule (#3529)
* feat(qemu): clean block ids history in DrCovModule after flush * refactor(qemu): rename clean_ids method for DrCovModule
1 parent 21df2a5 commit cd402f7

File tree

1 file changed

+28
-2
lines changed

1 file changed

+28
-2
lines changed

crates/libafl_qemu/src/modules/drcov.rs

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ use crate::{
3030
/// Trace of `block_id`s met at runtime
3131
static DRCOV_IDS: Mutex<Option<Vec<u64>>> = Mutex::new(None);
3232

33-
///Map of `pc` -> `block_id`
33+
/// Map of `pc` -> `block_id`
3434
static DRCOV_MAP: Mutex<Option<HashMap<GuestAddr, u64>>> = Mutex::new(None);
3535

3636
/// Map of `pc` -> `block_len`
@@ -60,6 +60,7 @@ pub struct DrCovModuleBuilder<F> {
6060
module_mapping: Option<RangeMap<u64, (u16, String)>>,
6161
path: Option<PathBuf>,
6262
full_trace: bool,
63+
clean_on_flush: bool,
6364
}
6465

6566
impl<F> DrCovModuleBuilder<F>
@@ -72,6 +73,7 @@ where
7273
self.path.unwrap(),
7374
self.module_mapping,
7475
self.full_trace,
76+
self.clean_on_flush,
7577
)
7678
}
7779

@@ -81,6 +83,7 @@ where
8183
module_mapping: self.module_mapping,
8284
path: self.path,
8385
full_trace: self.full_trace,
86+
clean_on_flush: self.clean_on_flush,
8487
}
8588
}
8689

@@ -91,6 +94,7 @@ where
9194
module_mapping: Some(module_mapping),
9295
path: self.path,
9396
full_trace: self.full_trace,
97+
clean_on_flush: self.clean_on_flush,
9498
}
9599
}
96100

@@ -101,6 +105,7 @@ where
101105
module_mapping: self.module_mapping,
102106
path: Some(path.into()),
103107
full_trace: self.full_trace,
108+
clean_on_flush: self.clean_on_flush,
104109
}
105110
}
106111

@@ -111,6 +116,19 @@ where
111116
module_mapping: self.module_mapping,
112117
path: self.path,
113118
full_trace,
119+
clean_on_flush: self.clean_on_flush,
120+
}
121+
}
122+
123+
/// Clean trace history of `block_id`s met at runtime every time after flushing to a file.
124+
#[must_use]
125+
pub fn clean_on_flush(self, clean_on_flush: bool) -> Self {
126+
Self {
127+
filter: self.filter,
128+
module_mapping: self.module_mapping,
129+
path: self.path,
130+
full_trace: true,
131+
clean_on_flush,
114132
}
115133
}
116134
}
@@ -121,6 +139,7 @@ pub struct DrCovModule<F> {
121139
module_mapping: Option<RangeMap<u64, (u16, String)>>,
122140
path: PathBuf,
123141
full_trace: bool,
142+
clean_on_flush: bool,
124143
drcov_len: usize,
125144
}
126145

@@ -379,6 +398,7 @@ impl DrCovModule<NopAddressFilter> {
379398
filter: Some(NopAddressFilter),
380399
module_mapping: None,
381400
full_trace: false,
401+
clean_on_flush: false,
382402
path: None,
383403
}
384404
}
@@ -391,6 +411,7 @@ impl<F> DrCovModule<F> {
391411
path: P,
392412
module_mapping: Option<RangeMap<u64, (u16, String)>>,
393413
full_trace: bool,
414+
clean_on_flush: bool,
394415
) -> Self {
395416
if full_trace {
396417
*DRCOV_IDS.lock().unwrap() = Some(vec![]);
@@ -404,6 +425,7 @@ impl<F> DrCovModule<F> {
404425
module_mapping,
405426
path: path.into(),
406427
full_trace,
428+
clean_on_flush,
407429
drcov_len: 0,
408430
}
409431
}
@@ -466,7 +488,11 @@ impl<F> DrCovModule<F> {
466488
.expect("Failed to write coverage file");
467489
}
468490
}
469-
self.drcov_len = DRCOV_IDS.lock().unwrap().as_ref().unwrap().len();
491+
if self.clean_on_flush {
492+
*DRCOV_IDS.lock().unwrap() = Some(vec![]);
493+
} else {
494+
self.drcov_len = DRCOV_IDS.lock().unwrap().as_ref().unwrap().len();
495+
}
470496
} else {
471497
if DRCOV_MAP.lock().unwrap().as_ref().unwrap().len() > self.drcov_len {
472498
let mut drcov_vec = Vec::<DrCovBasicBlock>::new();

0 commit comments

Comments
 (0)