Skip to content

Commit d9b66e0

Browse files
committed
Allow filtering observed functions and add debug functions for that
1 parent 45352ad commit d9b66e0

File tree

3 files changed

+73
-3
lines changed

3 files changed

+73
-3
lines changed

fuzzcheck/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ regex-syntax = { version = "0.6.27", optional = true }
4444
nu-ansi-term = "0.46.0"
4545

4646
bit-vec = "0.6.3"
47+
rustc-demangle = "0.1.21"
4748

4849
[lib]
4950
name = "fuzzcheck"

fuzzcheck/src/builder.rs

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -433,6 +433,22 @@ where
433433
V: Clone + 'static,
434434
M: Mutator<V>,
435435
{
436+
#[no_coverage]
437+
pub fn default_sensor_and_pool_with_custom_filter(
438+
self,
439+
keep: impl Fn(&Path, &str) -> bool,
440+
) -> FuzzerBuilder4<F, M, V, DiverseAndMaxHitsSensor, BasicAndDiverseAndMaxHitsPool> {
441+
let (sensor, pool) = default_sensor_and_pool_with_custom_filter(keep).finish();
442+
FuzzerBuilder4 {
443+
test_function: self.test_function,
444+
mutator: self.mutator,
445+
serializer: self.serializer,
446+
sensor,
447+
pool,
448+
_phantom: PhantomData,
449+
}
450+
}
451+
436452
#[no_coverage]
437453
pub fn default_sensor_and_pool(
438454
self,
@@ -715,6 +731,20 @@ pub fn basic_sensor_and_pool() -> SensorAndPoolBuilder<BasicSensor, BasicPool> {
715731
}
716732
}
717733

734+
/// Like [`basic_sensor_and_pool`], but uses a closure to determine which function should
735+
/// be observed by the code coverage sensor.
736+
#[no_coverage]
737+
pub fn basic_sensor_and_pool_with_custom_filter(
738+
keep: impl Fn(&Path, &str) -> bool,
739+
) -> SensorAndPoolBuilder<BasicSensor, BasicPool> {
740+
let sensor = CodeCoverageSensor::new(keep);
741+
let nbr_counters = sensor.count_instrumented;
742+
SensorAndPoolBuilder {
743+
sensor,
744+
pool: SimplestToActivateCounterPool::new("simplest_cov", nbr_counters),
745+
}
746+
}
747+
718748
/// Create the [sensor and pool builder](SensorAndPoolBuilder) that is used by default by fuzzcheck
719749
///
720750
/// Currently, the result cannot be augmented any further. Thus, the only action you can take on the result is to
@@ -725,6 +755,18 @@ pub fn default_sensor_and_pool() -> SensorAndPoolBuilder<DiverseAndMaxHitsSensor
725755
.find_most_diverse_set_of_test_cases(20)
726756
.find_test_cases_repeatedly_hitting_coverage_counters()
727757
}
758+
759+
/// Like [`default_sensor_and_pool`], but uses a closure to determine which function should
760+
/// be observed by the code coverage sensor.
761+
#[no_coverage]
762+
pub fn default_sensor_and_pool_with_custom_filter(
763+
keep: impl Fn(&Path, &str) -> bool,
764+
) -> SensorAndPoolBuilder<DiverseAndMaxHitsSensor, BasicAndDiverseAndMaxHitsPool> {
765+
basic_sensor_and_pool_with_custom_filter(keep)
766+
.find_most_diverse_set_of_test_cases(20)
767+
.find_test_cases_repeatedly_hitting_coverage_counters()
768+
}
769+
728770
/// A builder to create a [sensor](Sensor) and [pool](crate::Pool) that can be given as argument to
729771
/// [`FuzzerBuilder3::sensor_and_pool`].
730772
///

fuzzcheck/src/code_coverage_sensor/mod.rs

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ mod llvm_coverage;
55
#[cfg(feature = "serde_json_serializer")]
66
mod serialized;
77

8-
use std::collections::HashMap;
8+
use std::collections::{BTreeSet, HashMap};
99
use std::convert::TryFrom;
1010
use std::path::{Path, PathBuf};
1111

@@ -38,13 +38,13 @@ impl CodeCoverageSensor {
3838
pub fn observing_only_files_from_current_dir() -> Self {
3939
Self::new(
4040
#[no_coverage]
41-
|f| f.is_relative(),
41+
|file, _function| file.is_relative(),
4242
)
4343
}
4444
#[no_coverage]
4545
pub fn new<K>(keep: K) -> Self
4646
where
47-
K: Fn(&Path) -> bool,
47+
K: Fn(&Path, &str) -> bool,
4848
{
4949
let exec = std::env::current_exe().expect("could not read current executable");
5050
let LLVMCovSections {
@@ -160,3 +160,30 @@ impl SaveToStatsFolder for CodeCoverageSensor {
160160
}
161161
}
162162
}
163+
164+
impl CodeCoverageSensor {
165+
#[no_coverage]
166+
pub fn print_observed_functions(&self) {
167+
let mut all = BTreeSet::new();
168+
for c in self.coverage.iter() {
169+
let name = &c.function_record.name_function;
170+
let name = rustc_demangle::demangle(name).to_string();
171+
all.insert(name.clone());
172+
}
173+
for name in all {
174+
println!("{name}");
175+
}
176+
}
177+
#[no_coverage]
178+
pub fn print_observed_files(&self) {
179+
let mut all = BTreeSet::new();
180+
for c in self.coverage.iter() {
181+
for name in c.function_record.filenames.iter() {
182+
all.insert(name.display().to_string());
183+
}
184+
}
185+
for name in all {
186+
println!("{name}");
187+
}
188+
}
189+
}

0 commit comments

Comments
 (0)