diff --git a/slither/core/cfg/node.py b/slither/core/cfg/node.py index 9b53b0db92..87d0e16a2e 100644 --- a/slither/core/cfg/node.py +++ b/slither/core/cfg/node.py @@ -11,6 +11,7 @@ SolidityFunction, ) from slither.core.expressions.expression import Expression +from slither.core.expressions import CallExpression, Identifier, AssignmentOperation from slither.core.solidity_types import ElementaryType from slither.core.source_mapping.source_mapping import SourceMapping from slither.core.variables.local_variable import LocalVariable @@ -898,6 +899,21 @@ def _find_read_write_call(self) -> None: # pylint: disable=too-many-statements # TODO: consider removing dependancy of solidity_call to internal_call self._solidity_calls.append(ir.function) self._internal_calls.append(ir.function) + if ( + isinstance(ir, SolidityCall) + and ir.function == SolidityFunction("sstore(uint256,uint256)") + and isinstance(ir.node.expression, CallExpression) + and isinstance(ir.node.expression.arguments[0], Identifier) + ): + self._vars_written.append(ir.arguments[0]) + if ( + isinstance(ir, SolidityCall) + and ir.function == SolidityFunction("sload(uint256)") + and isinstance(ir.node.expression, AssignmentOperation) + and isinstance(ir.node.expression.expression_right, CallExpression) + and isinstance(ir.node.expression.expression_right.arguments[0], Identifier) + ): + self._vars_read.append(ir.arguments[0]) if isinstance(ir, LowLevelCall): assert isinstance(ir.destination, (Variable, SolidityVariable)) self._low_level_calls.append((ir.destination, str(ir.function_name.value))) diff --git a/tests/e2e/detectors/test_data/constable-states/0.8.0/const_state_variables.sol b/tests/e2e/detectors/test_data/constable-states/0.8.0/const_state_variables.sol index f405a15875..00b0955c85 100644 --- a/tests/e2e/detectors/test_data/constable-states/0.8.0/const_state_variables.sol +++ b/tests/e2e/detectors/test_data/constable-states/0.8.0/const_state_variables.sol @@ -66,7 +66,7 @@ contract Good { uint immutable should_be_immutable_3 = 10 + block.number; B immutable should_be_immutable_4 = new B(); uint immutable should_be_immutable_5; - + uint blobBaseFee; constructor(uint b) { should_be_immutable_5 = b; } @@ -74,5 +74,10 @@ contract Good { function getNumber() public returns(uint){ return block.number; } - + + function updateBlobBaseFee(uint _blobBaseFee) public { + assembly { + sstore(blobBaseFee.slot, _blobBaseFee) + } + } } \ No newline at end of file diff --git a/tests/e2e/detectors/test_data/constable-states/0.8.0/const_state_variables.sol-0.8.0.zip b/tests/e2e/detectors/test_data/constable-states/0.8.0/const_state_variables.sol-0.8.0.zip index d04c3f8e79..7afd3884bb 100644 Binary files a/tests/e2e/detectors/test_data/constable-states/0.8.0/const_state_variables.sol-0.8.0.zip and b/tests/e2e/detectors/test_data/constable-states/0.8.0/const_state_variables.sol-0.8.0.zip differ