diff --git a/examples/scripts/data_dependency.py b/examples/scripts/data_dependency.py index 23c82cae11..5edbe49238 100644 --- a/examples/scripts/data_dependency.py +++ b/examples/scripts/data_dependency.py @@ -126,3 +126,17 @@ assert is_tainted(var_tainted, contract) print(f"{var_not_tainted} is tainted: {is_tainted(var_not_tainted, contract)}") assert not is_tainted(var_not_tainted, contract) + +print("SimpleModifier contract") +contracts = slither.get_contract_from_name("SimpleModifier") +assert len(contracts) == 1 +contract = contracts[0] +dependent_state_var = contract.get_state_variable_from_name("owner") +assert dependent_state_var +baz = contract.get_modifier_from_signature("baz()") +intermediate = baz.get_local_variable_from_name("intermediate") +assert intermediate +print( + f"{intermediate} depends on msg.sender: {is_dependent(intermediate, SolidityVariableComposed('msg.sender'), baz)}" +) +assert is_dependent(intermediate, SolidityVariableComposed("msg.sender"), baz) diff --git a/examples/scripts/data_dependency.sol b/examples/scripts/data_dependency.sol index a4f64870af..b4baf5c090 100644 --- a/examples/scripts/data_dependency.sol +++ b/examples/scripts/data_dependency.sol @@ -115,3 +115,12 @@ contract PropagateThroughReturnValue { return (var_state); } } + +contract SimpleModifier { + address owner; + modifier baz { + bool intermediate = msg.sender == owner; + require(intermediate); + _; + } +} \ No newline at end of file diff --git a/slither/solc_parsing/declarations/modifier.py b/slither/solc_parsing/declarations/modifier.py index c4c5c71772..dfacc87038 100644 --- a/slither/solc_parsing/declarations/modifier.py +++ b/slither/solc_parsing/declarations/modifier.py @@ -93,6 +93,8 @@ def analyze_content(self) -> None: self._rewrite_ternary_as_if_else() self._remove_alone_endif() + if self._function.entry_point: + self._update_reachability(self._function.entry_point) # self._analyze_read_write() # self._analyze_calls()