def _create_node( self, func: Function, counter: int, variable: "Variable", scope: Union[Scope, Function] ): from slither.core.cfg.node import Node, NodeType from slither.core.expressions import ( AssignmentOperationType, AssignmentOperation, Identifier, ) # Function uses to create node for state variable declaration statements node = Node(NodeType.OTHER_ENTRYPOINT, counter, scope) node.set_offset(variable.source_mapping, self.compilation_unit) node.set_function(func) func.add_node(node) assert variable.expression expression = AssignmentOperation( Identifier(variable), variable.expression, AssignmentOperationType.ASSIGN, variable.type, ) expression.set_offset(variable.source_mapping, self.compilation_unit) node.add_expression(expression) return node
def _create_node(self, func, counter, variable): # Function uses to create node for state variable declaration statements node = Node(NodeType.OTHER_ENTRYPOINT, counter) node.set_offset(variable.source_mapping, self.slither) node.set_function(func) func.add_node(node) expression = AssignmentOperation(Identifier(variable), variable.expression, AssignmentOperationType.ASSIGN, variable.type) expression.set_offset(variable.source_mapping, self.slither) node.add_expression(expression) return node
def _parse_yul_assignment_common(root: YulScope, node: YulNode, ast: Dict, key: str) -> Optional[Expression]: lhs = [parse_yul(root, node, arg) for arg in ast[key]] rhs = parse_yul(root, node, ast["value"]) return AssignmentOperation(vars_to_val(lhs), rhs, AssignmentOperationType.ASSIGN, vars_to_typestr(lhs))
def analyze_expressions(self): if self._node.type == NodeType.VARIABLE and not self._node.expression: self._node.add_expression( self._node.variable_declaration.expression) if self._unparsed_expression: expression = parse_yul(self._scope, self, self._unparsed_expression) self._node.add_expression(expression) if self._node.expression: if self._node.type == NodeType.VARIABLE: # Update the expression to be an assignement to the variable _expression = AssignmentOperation( Identifier(self._node.variable_declaration), self._node.expression, AssignmentOperationType.ASSIGN, self._node.variable_declaration.type, ) _expression.set_offset(self._node.expression.source_mapping, self._node.slither) self._node.add_expression(_expression, bypass_verif_empty=True) expression = self._node.expression read_var = ReadVar(expression) self._node.variables_read_as_expression = read_var.result() write_var = WriteVar(expression) self._node.variables_written_as_expression = write_var.result() find_call = FindCalls(expression) self._node.calls_as_expression = find_call.result() self._node.external_calls_as_expressions = [ c for c in self._node.calls_as_expression if not isinstance(c.called, Identifier) ] self._node.internal_calls_as_expressions = [ c for c in self._node.calls_as_expression if isinstance(c.called, Identifier) ]