Skip to content

Commit

Permalink
remove union strategy
Browse files Browse the repository at this point in the history
  • Loading branch information
TilakMaddy committed Oct 4, 2024
1 parent 0c85990 commit d645fbb
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 79 deletions.
13 changes: 0 additions & 13 deletions aderyn_core/src/detect/detector.rs
Original file line number Diff line number Diff line change
Expand Up @@ -455,15 +455,6 @@ pub enum IssueSeverity {
High,
}

/// When different contexts report different number of instances for the same file, this is a merge
/// conflict and we need a resolution strategy.
pub enum MergeConflictResolutionStrategy {
/// Consider the common instances reported across all contexts
Intersection,
/// Consider all the instances reported across all contexts
Union,
}

impl Display for IssueSeverity {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let issue_description = match self {
Expand Down Expand Up @@ -511,8 +502,4 @@ pub trait IssueDetector: Send + Sync + 'static {
fn hints(&self) -> BTreeMap<(String, usize, String), String> {
BTreeMap::new()
}

fn merge_conflict_resolution_strategy(&self) -> MergeConflictResolutionStrategy {
MergeConflictResolutionStrategy::Intersection
}
}
126 changes: 60 additions & 66 deletions aderyn_core/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -160,86 +160,80 @@ pub fn get_report(
//
// Alternative way would be UNION strategy
//
//

match detector.merge_conflict_resolution_strategy() {
detect::detector::MergeConflictResolutionStrategy::Intersection => {
#[allow(clippy::complexity)]
let mut grouped_instances: BTreeMap<
String,
Vec<BTreeMap<(String, usize, String), i64>>,
> = Default::default();

for (instances, hints, src_filepaths) in collection_of_instances {
let mut grouped_instances_context: BTreeMap<
String,
BTreeMap<(String, usize, String), i64>,
> = BTreeMap::new();

for (key, value) in instances {
match grouped_instances_context.entry(key.0.clone()) {
Entry::Vacant(v) => {
let mut mini_btree = BTreeMap::new();
mini_btree.insert(key, value);
v.insert(mini_btree);
}
Entry::Occupied(mut o) => {
o.get_mut().insert(key, value);
}
};
}

for key in src_filepaths {
if let Entry::Vacant(v) = grouped_instances_context.entry(key) {
v.insert(Default::default());
}
// NOTE: Intersection strategy logic
#[allow(clippy::complexity)]
let mut grouped_instances: BTreeMap<
String,
Vec<BTreeMap<(String, usize, String), i64>>,
> = Default::default();

for (instances, hints, src_filepaths) in collection_of_instances {
let mut grouped_instances_context: BTreeMap<
String,
BTreeMap<(String, usize, String), i64>,
> = BTreeMap::new();

for (key, value) in instances {
match grouped_instances_context.entry(key.0.clone()) {
Entry::Vacant(v) => {
let mut mini_btree = BTreeMap::new();
mini_btree.insert(key, value);
v.insert(mini_btree);
}

for (key, value) in grouped_instances_context {
match grouped_instances.entry(key.clone()) {
Entry::Vacant(v) => {
v.insert(vec![value]);
}
Entry::Occupied(mut o) => {
o.get_mut().push(value);
}
}
Entry::Occupied(mut o) => {
o.get_mut().insert(key, value);
}
};
}

detector_hints.extend(hints);
for key in src_filepaths {
if let Entry::Vacant(v) = grouped_instances_context.entry(key) {
v.insert(Default::default());
}
}

for (_filename, value) in grouped_instances {
// Find the common instances across all the contexts' BTrees.

let mut selected_instances = BTreeMap::new();

for instances in &value {
for instance in instances {
if value
.iter()
.all(|tree| tree.contains_key(&instance.0.clone()))
{
selected_instances.insert(instance.0.clone(), *instance.1);
}
}
for (key, value) in grouped_instances_context {
match grouped_instances.entry(key.clone()) {
Entry::Vacant(v) => {
v.insert(vec![value]);
}
Entry::Occupied(mut o) => {
o.get_mut().push(value);
}

detectors_instances.extend(selected_instances);
}
}

// Default to the old way for this strategy
detect::detector::MergeConflictResolutionStrategy::Union => {
for (instances, hints, _src_filepaths) in collection_of_instances.into_iter() {
if instances.is_empty() {
continue;
detector_hints.extend(hints);
}

for (_filename, value) in grouped_instances {
// Find the common instances across all the contexts' BTrees.

let mut selected_instances = BTreeMap::new();

for instances in &value {
for instance in instances {
if value
.iter()
.all(|tree| tree.contains_key(&instance.0.clone()))
{
selected_instances.insert(instance.0.clone(), *instance.1);
}
detectors_instances.extend(instances);
detector_hints.extend(hints);
}
}

detectors_instances.extend(selected_instances);
}
// NOTE: Union strategy would work something like this
//
// for (instances, hints, _src_filepaths) in collection_of_instances.into_iter() {
// if instances.is_empty() {
// continue;
// }
// detectors_instances.extend(instances);
// detector_hints.extend(hints);
// }

if detectors_instances.is_empty() {
return None;
Expand Down

0 comments on commit d645fbb

Please sign in to comment.