Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Detector: Cache array length #664

Merged
merged 33 commits into from
Aug 19, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
eac3d08
finder
TilakMaddy Jul 31, 2024
859389b
has variable been manipulated
TilakMaddy Aug 6, 2024
fefc4cf
clippy fix
TilakMaddy Aug 6, 2024
7579a0b
fixed size array tests
TilakMaddy Aug 6, 2024
ebe123b
more test coverage
TilakMaddy Aug 6, 2024
29ad0ea
assigning to storage pointer case covered
TilakMaddy Aug 6, 2024
8a8b579
finder fix
TilakMaddy Aug 6, 2024
6a3159a
cli/reportgen
TilakMaddy Aug 6, 2024
47c8382
no struct assignment test
TilakMaddy Aug 6, 2024
8e9dcb9
dynamic array direct push
TilakMaddy Aug 6, 2024
c19d7b2
tests work
TilakMaddy Aug 6, 2024
6abae97
approxiamate state variable manipulation finder
TilakMaddy Aug 6, 2024
2fd3cf5
spelling errir
TilakMaddy Aug 6, 2024
e7e589d
more assertions in tests
TilakMaddy Aug 6, 2024
b91098b
more public functions to interact
TilakMaddy Aug 6, 2024
e12ae16
impl Add for Finder
TilakMaddy Aug 6, 2024
a20d5f0
docs
TilakMaddy Aug 7, 2024
c76cf97
checkpoint
TilakMaddy Aug 7, 2024
7685af6
yanked read finder. back to only finding writes/changes
TilakMaddy Aug 8, 2024
979d871
clippy fix
TilakMaddy Aug 8, 2024
90a42ee
merge dev
TilakMaddy Aug 12, 2024
f5d137d
test for +=, -=, *= (assignment operations)
TilakMaddy Aug 12, 2024
d5e8cf4
test for --, ++ (unary operations)
TilakMaddy Aug 12, 2024
18c1e44
cli/reportgen
TilakMaddy Aug 12, 2024
d6665c5
serial tests
TilakMaddy Aug 12, 2024
7844e57
detector
TilakMaddy Aug 12, 2024
dda72ac
detector
TilakMaddy Aug 12, 2024
6cd29c4
cli/reportgen
TilakMaddy Aug 12, 2024
d1358cb
clippy
TilakMaddy Aug 12, 2024
11ebb5f
merge dev
TilakMaddy Aug 18, 2024
352d20f
merge dev
alexroan Aug 19, 2024
16d9c2e
clippy fix
alexroan Aug 19, 2024
9eef403
reportgen
alexroan Aug 19, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
62 changes: 31 additions & 31 deletions aderyn_core/src/context/browser/storage_vars.rs
Original file line number Diff line number Diff line change
Expand Up @@ -35,10 +35,10 @@ pub struct ApproximateStorageChangeFinder<'a> {
}

/// This trait implementation will be useful when we run it through our callgraph and try to aggregate state variable changes.
impl<'a> Add<&'a ApproximateStorageChangeFinder<'_>> for ApproximateStorageChangeFinder<'a> {
impl<'a> Add<ApproximateStorageChangeFinder<'_>> for ApproximateStorageChangeFinder<'a> {
type Output = ApproximateStorageChangeFinder<'a>;

fn add(mut self, rhs: &ApproximateStorageChangeFinder) -> Self::Output {
fn add(mut self, rhs: ApproximateStorageChangeFinder) -> Self::Output {
self.directly_manipulated_state_variables
.extend(rhs.directly_manipulated_state_variables.iter());
self.manipulated_storage_pointers
Expand Down Expand Up @@ -624,7 +624,7 @@ mod approximate_storage_change_finder_tests {
let contract = context.find_contract_by_name("NoStateVarManipulationExample");
let func = contract.find_function_by_name("dontManipulateStateVar");

let finder = ApproximateStorageChangeFinder::from(&context, func.into());
let finder = ApproximateStorageChangeFinder::from(&context, func);
let no_changes_found = !finder.state_variables_have_been_manipulated();
println!(
"NoStateVarManipulationExample::dontManipulateStateVar()\n{:?}",
Expand All @@ -645,7 +645,7 @@ mod approximate_storage_change_finder_tests {
let func = contract.find_function_by_name("manipulateStateVarDirectly");
let func2 = contract.find_function_by_name("readSimpleStateVars");

let finder = ApproximateStorageChangeFinder::from(&context, func.into());
let finder = ApproximateStorageChangeFinder::from(&context, func);
let changes_found = finder.state_variables_have_been_manipulated();
println!(
"SimpleStateVarManipulationExample::manipulateStateVarDirectly()\n{:?}",
Expand All @@ -655,7 +655,7 @@ mod approximate_storage_change_finder_tests {
assert_eq!(finder.directly_manipulated_state_variables.len(), 5);
assert!(finder.manipulated_storage_pointers.is_empty());

let finder = ApproximateStorageChangeFinder::from(&context, func2.into());
let finder = ApproximateStorageChangeFinder::from(&context, func2);
let changes_found = finder.state_variables_have_been_manipulated();
println!(
"SimpleStateVarManipulationExample::readSimpleStateVars()\n{:?}",
Expand All @@ -680,7 +680,7 @@ mod approximate_storage_change_finder_tests {

// Test manipulateDirectly() function

let finder = ApproximateStorageChangeFinder::from(&context, func1.into());
let finder = ApproximateStorageChangeFinder::from(&context, func1);
println!(
"FixedSizeArraysAssignmentExample::manipulateDirectly()\n{:?}",
finder
Expand All @@ -693,7 +693,7 @@ mod approximate_storage_change_finder_tests {

// Test manipulateViaIndexAccess() function

let finder = ApproximateStorageChangeFinder::from(&context, func2.into());
let finder = ApproximateStorageChangeFinder::from(&context, func2);
println!(
"FixedSizeArraysAssignmentExample::manipulateViaIndexAccess()\n{:?}",
finder
Expand Down Expand Up @@ -725,7 +725,7 @@ mod approximate_storage_change_finder_tests {
let func_helper = contract.find_function_by_name("manipulateHelper");

// Test manipulateStateVariables
let finder = ApproximateStorageChangeFinder::from(&context, func.into());
let finder = ApproximateStorageChangeFinder::from(&context, func);
println!(
"StructPlusFixedArrayAssignmentExample::manipulateStateVariables()\n{:?}",
finder
Expand All @@ -736,7 +736,7 @@ mod approximate_storage_change_finder_tests {
assert!(finder.manipulated_storage_pointers.is_empty());

// Test manipulateStateVariables2
let finder = ApproximateStorageChangeFinder::from(&context, func2.into());
let finder = ApproximateStorageChangeFinder::from(&context, func2);
println!(
"StructPlusFixedArrayAssignmentExample::manipulateStateVariables2()\n{:?}",
finder
Expand All @@ -763,7 +763,7 @@ mod approximate_storage_change_finder_tests {
assert!(finder.directly_manipulated_state_variables.is_empty());

// Test manipulateStateVariables3
let finder = ApproximateStorageChangeFinder::from(&context, func3.into());
let finder = ApproximateStorageChangeFinder::from(&context, func3);
println!(
"StructPlusFixedArrayAssignmentExample::manipulateStateVariables3()\n{:?}",
finder
Expand All @@ -783,7 +783,7 @@ mod approximate_storage_change_finder_tests {
);

// Test manipulateStateVariables4
let finder = ApproximateStorageChangeFinder::from(&context, func4.into());
let finder = ApproximateStorageChangeFinder::from(&context, func4);
println!(
"StructPlusFixedArrayAssignmentExample::manipulateStateVariables4()\n{:?}",
finder
Expand All @@ -794,7 +794,7 @@ mod approximate_storage_change_finder_tests {
assert!(finder.directly_manipulated_state_variables.is_empty());

// Test manipulateStateVariables5
let finder = ApproximateStorageChangeFinder::from(&context, func5.into());
let finder = ApproximateStorageChangeFinder::from(&context, func5);
println!(
"StructPlusFixedArrayAssignmentExample::manipulateStateVariables5()\n{:?}",
finder
Expand All @@ -814,7 +814,7 @@ mod approximate_storage_change_finder_tests {
);

// Test funcHelper
let finder = ApproximateStorageChangeFinder::from(&context, func_helper.into());
let finder = ApproximateStorageChangeFinder::from(&context, func_helper);
println!(
"StructPlusFixedArrayAssignmentExample::manipulateHelper()\n{:?}",
finder
Expand All @@ -833,7 +833,7 @@ mod approximate_storage_change_finder_tests {
);

// Test manipulateStateVariables6
let finder = ApproximateStorageChangeFinder::from(&context, func6.into());
let finder = ApproximateStorageChangeFinder::from(&context, func6);
println!(
"StructPlusFixedArrayAssignmentExample::manipulateStateVariables6()\n{:?}",
finder
Expand All @@ -852,7 +852,7 @@ mod approximate_storage_change_finder_tests {
);

// Test manipulateStateVariables7
let finder = ApproximateStorageChangeFinder::from(&context, func7.into());
let finder = ApproximateStorageChangeFinder::from(&context, func7);
println!(
"StructPlusFixedArrayAssignmentExample::manipulateStateVariables7()\n{:?}",
finder
Expand All @@ -863,7 +863,7 @@ mod approximate_storage_change_finder_tests {
assert_eq!(finder.directly_manipulated_state_variables.len(), 3);

// Test manipulateStateVariables8
let finder = ApproximateStorageChangeFinder::from(&context, func8.into());
let finder = ApproximateStorageChangeFinder::from(&context, func8);
println!(
"StructPlusFixedArrayAssignmentExample::manipulateStateVariables8()\n{:?}",
finder
Expand All @@ -888,23 +888,23 @@ mod approximate_storage_change_finder_tests {
let func3 = contract.find_function_by_name("manipulateLib3");

// Test manipulateLib()
let finder = ApproximateStorageChangeFinder::from(&context, func.into());
let finder = ApproximateStorageChangeFinder::from(&context, func);
println!("SVManipulationLibrary::manipulateLib()\n{:?}", finder);
let changes_found = finder.state_variables_have_been_manipulated();
assert!(changes_found);
assert_eq!(finder.manipulated_storage_pointers.len(), 1);
assert!(finder.directly_manipulated_state_variables.is_empty());

// Test manipulateLib2()
let finder = ApproximateStorageChangeFinder::from(&context, func2.into());
let finder = ApproximateStorageChangeFinder::from(&context, func2);
println!("SVManipulationLibrary::manipulateLib2()\n{:?}", finder);
let changes_found = finder.state_variables_have_been_manipulated();
assert!(changes_found);
assert_eq!(finder.manipulated_storage_pointers.len(), 1);
assert!(finder.directly_manipulated_state_variables.is_empty());

// Test manipulateLib3()
let finder = ApproximateStorageChangeFinder::from(&context, func3.into());
let finder = ApproximateStorageChangeFinder::from(&context, func3);
println!("SVManipulationLibrary::manipulateLib3()\n{:?}", finder);
let changes_found = finder.state_variables_have_been_manipulated();
assert!(changes_found);
Expand All @@ -928,7 +928,7 @@ mod approximate_storage_change_finder_tests {
let func5 = contract.find_function_by_name("dontManipulateStateVariablesPart5");

// Test dontManipulateStateVariables()
let finder = ApproximateStorageChangeFinder::from(&context, func.into());
let finder = ApproximateStorageChangeFinder::from(&context, func);
println!(
"NoStructPlusFixedArrayAssignmentExample::dontManipulateStateVariables()\n{:?}",
finder
Expand All @@ -939,7 +939,7 @@ mod approximate_storage_change_finder_tests {
assert!(finder.directly_manipulated_state_variables.is_empty());

// Test dontManipulateStateVariablesPart2()
let finder = ApproximateStorageChangeFinder::from(&context, func2.into());
let finder = ApproximateStorageChangeFinder::from(&context, func2);
println!(
"NoStructPlusFixedArrayAssignmentExample::dontManipulateStateVariablesPart2()\n{:?}",
finder
Expand All @@ -950,7 +950,7 @@ mod approximate_storage_change_finder_tests {
assert!(finder.directly_manipulated_state_variables.is_empty());

// Test dontManipulateStateVariablesPart3()
let finder = ApproximateStorageChangeFinder::from(&context, func3.into());
let finder = ApproximateStorageChangeFinder::from(&context, func3);
println!(
"NoStructPlusFixedArrayAssignmentExample::dontManipulateStateVariablesPart3()\n{:?}",
finder
Expand All @@ -961,7 +961,7 @@ mod approximate_storage_change_finder_tests {
assert!(finder.directly_manipulated_state_variables.is_empty());

// Test dontManipulateStateVariablesPart4()
let finder = ApproximateStorageChangeFinder::from(&context, func4.into());
let finder = ApproximateStorageChangeFinder::from(&context, func4);
println!(
"NoStructPlusFixedArrayAssignmentExample::dontManipulateStateVariablesPart4()\n{:?}",
finder
Expand All @@ -972,7 +972,7 @@ mod approximate_storage_change_finder_tests {
assert!(finder.directly_manipulated_state_variables.is_empty());

// Test dontManipulateStateVariablesPart4()
let finder = ApproximateStorageChangeFinder::from(&context, func5.into());
let finder = ApproximateStorageChangeFinder::from(&context, func5);
println!(
"NoStructPlusFixedArrayAssignmentExample::dontManipulateStateVariablesPart5()\n{:?}",
finder
Expand All @@ -998,7 +998,7 @@ mod approximate_storage_change_finder_tests {
let func4 = contract.find_function_by_name("manipulateViaMemberAccess2");

// Test manipulateDirectly()
let finder = ApproximateStorageChangeFinder::from(&context, func.into());
let finder = ApproximateStorageChangeFinder::from(&context, func);
println!(
"DynamicArraysPushExample::manipulateDirectly()\n{:?}",
finder
Expand All @@ -1009,7 +1009,7 @@ mod approximate_storage_change_finder_tests {
assert_eq!(finder.directly_manipulated_state_variables.len(), 1);

// Test manipulateViaIndexAccess()
let finder = ApproximateStorageChangeFinder::from(&context, func2.into());
let finder = ApproximateStorageChangeFinder::from(&context, func2);
println!(
"DynamicArraysPushExample::manipulateViaIndexAccess()\n{:?}",
finder
Expand All @@ -1020,7 +1020,7 @@ mod approximate_storage_change_finder_tests {
assert_eq!(finder.directly_manipulated_state_variables.len(), 3);

// Test manipulateViaMemberAccess()
let finder = ApproximateStorageChangeFinder::from(&context, func3.into());
let finder = ApproximateStorageChangeFinder::from(&context, func3);
println!(
"DynamicArraysPushExample::manipulateViaMemberAccess()\n{:?}",
finder
Expand All @@ -1031,7 +1031,7 @@ mod approximate_storage_change_finder_tests {
assert_eq!(finder.directly_manipulated_state_variables.len(), 1);

// Test manipulateViaMemberAccess2()
let finder = ApproximateStorageChangeFinder::from(&context, func4.into());
let finder = ApproximateStorageChangeFinder::from(&context, func4);
println!(
"DynamicArraysPushExample::manipulateViaMemberAccess2()\n{:?}",
finder
Expand All @@ -1053,7 +1053,7 @@ mod approximate_storage_change_finder_tests {
let func = contract.find_function_by_name("add");

// Test add()
let finder = ApproximateStorageChangeFinder::from(&context, func.into());
let finder = ApproximateStorageChangeFinder::from(&context, func);
println!("DynamicMappingsArrayPushExample::add()\n{:?}", finder);
let changes_found = finder.state_variables_have_been_manipulated();
assert!(changes_found);
Expand All @@ -1073,7 +1073,7 @@ mod approximate_storage_change_finder_tests {
let func2 = contract.find_function_by_name("manipulateViaIndexAccess");

// Test func()
let finder = ApproximateStorageChangeFinder::from(&context, func.into());
let finder = ApproximateStorageChangeFinder::from(&context, func);
println!(
"FixedSizeArraysDeletionExample::manipulateDirectly()\n{:?}",
finder
Expand All @@ -1084,7 +1084,7 @@ mod approximate_storage_change_finder_tests {
assert!(finder.manipulated_storage_pointers.is_empty());

// Test func2()
let finder = ApproximateStorageChangeFinder::from(&context, func2.into());
let finder = ApproximateStorageChangeFinder::from(&context, func2);
println!(
"FixedSizeArraysDeletionExample::manipulateViaIndexAccess()\n{:?}",
finder
Expand Down
3 changes: 3 additions & 0 deletions aderyn_core/src/detect/detector.rs
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,7 @@ pub fn get_all_issue_detectors() -> Vec<Box<dyn IssueDetector>> {
Box::<ReturnBombDetector>::default(),
Box::<OutOfOrderRetryableDetector>::default(),
Box::<FunctionInitializingStateDetector>::default(),
Box::<CacheArrayLengthDetector>::default(),
Box::<AssertStateChangeDetector>::default(),
Box::<CostlyOperationsInsideLoopsDetector>::default(),
Box::<ConstantFunctionChangingStateDetector>::default(),
Expand All @@ -102,6 +103,7 @@ pub fn get_all_detectors_names() -> Vec<String> {
#[derive(Debug, PartialEq, EnumString, Display)]
#[strum(serialize_all = "kebab-case")]
pub(crate) enum IssueDetectorNamePool {
CacheArrayLength,
AssertStateChange,
CostlyOperationsInsideLoops,
ConstantFunctionChangingState,
Expand Down Expand Up @@ -185,6 +187,7 @@ pub fn request_issue_detector_by_name(detector_name: &str) -> Option<Box<dyn Iss
// Expects a valid detector_name
let detector_name = IssueDetectorNamePool::from_str(detector_name).ok()?;
match detector_name {
IssueDetectorNamePool::CacheArrayLength => Some(Box::<CacheArrayLengthDetector>::default()),
IssueDetectorNamePool::AssertStateChange => {
Some(Box::<AssertStateChangeDetector>::default())
}
Expand Down
Loading
Loading