Track storage variables read/written in assembly

pull/2329/head
Simone 9 months ago
parent 3163e248dc
commit d592e76dea
  1. 16
      slither/core/cfg/node.py

@ -11,6 +11,7 @@ from slither.core.declarations.solidity_variables import (
SolidityFunction, SolidityFunction,
) )
from slither.core.expressions.expression import Expression 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.solidity_types import ElementaryType
from slither.core.source_mapping.source_mapping import SourceMapping from slither.core.source_mapping.source_mapping import SourceMapping
from slither.core.variables.local_variable import LocalVariable from slither.core.variables.local_variable import LocalVariable
@ -898,6 +899,21 @@ class Node(SourceMapping): # pylint: disable=too-many-public-methods
# TODO: consider removing dependancy of solidity_call to internal_call # TODO: consider removing dependancy of solidity_call to internal_call
self._solidity_calls.append(ir.function) self._solidity_calls.append(ir.function)
self._internal_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): if isinstance(ir, LowLevelCall):
assert isinstance(ir.destination, (Variable, SolidityVariable)) assert isinstance(ir.destination, (Variable, SolidityVariable))
self._low_level_calls.append((ir.destination, str(ir.function_name.value))) self._low_level_calls.append((ir.destination, str(ir.function_name.value)))

Loading…
Cancel
Save