mirror of https://github.com/crytic/slither
parent
cb375eeb80
commit
a4428211a3
@ -0,0 +1,105 @@ |
||||
|
||||
from slither.visitors.expression.expression import ExpressionVisitor |
||||
|
||||
from slither.core.expressions.assignment_operation import AssignmentOperationType |
||||
|
||||
from slither.core.variables.variable import Variable |
||||
from slither.core.declarations.solidity_variables import SolidityVariable |
||||
|
||||
key = 'ReadVarSyntactic' |
||||
|
||||
def get(expression): |
||||
val = expression.context[key] |
||||
# we delete the item to reduce memory use |
||||
del expression.context[key] |
||||
return val |
||||
|
||||
def set_val(expression, val): |
||||
expression.context[key] = val |
||||
|
||||
# This Visitor is similar to ReadVar |
||||
# Except that it does explore all assignements operations |
||||
# Read is in the context of source code read, rather than semantic-based read |
||||
class ReadVarSyntactic(ExpressionVisitor): |
||||
|
||||
def result(self): |
||||
if self._result is None: |
||||
self._result = list(set(get(self.expression))) |
||||
return self._result |
||||
|
||||
|
||||
def _post_assignement_operation(self, expression): |
||||
left = get(expression.expression_left) |
||||
right = get(expression.expression_right) |
||||
val = left + right |
||||
set_val(expression, val) |
||||
|
||||
def _post_binary_operation(self, expression): |
||||
left = get(expression.expression_left) |
||||
right = get(expression.expression_right) |
||||
val = left + right |
||||
set_val(expression, val) |
||||
|
||||
def _post_call_expression(self, expression): |
||||
called = get(expression.called) |
||||
args = [get(a) for a in expression.arguments if a] |
||||
args = [item for sublist in args for item in sublist] |
||||
val = called + args |
||||
set_val(expression, val) |
||||
|
||||
def _post_conditional_expression(self, expression): |
||||
if_expr = get(expression.if_expression) |
||||
else_expr = get(expression.else_expression) |
||||
then_expr = get(expression.then_expression) |
||||
val = if_expr + else_expr + then_expr |
||||
set_val(expression, val) |
||||
|
||||
def _post_elementary_type_name_expression(self, expression): |
||||
set_val(expression, []) |
||||
|
||||
# save only identifier expression |
||||
def _post_identifier(self, expression): |
||||
if isinstance(expression.value, Variable): |
||||
set_val(expression, [expression]) |
||||
elif isinstance(expression.value, SolidityVariable): |
||||
set_val(expression, [expression]) |
||||
else: |
||||
set_val(expression, []) |
||||
|
||||
def _post_index_access(self, expression): |
||||
left = get(expression.expression_left) |
||||
right = get(expression.expression_right) |
||||
val = left + right + [expression] |
||||
set_val(expression, val) |
||||
|
||||
def _post_literal(self, expression): |
||||
set_val(expression, []) |
||||
|
||||
def _post_member_access(self, expression): |
||||
expr = get(expression.expression) |
||||
val = expr |
||||
set_val(expression, val) |
||||
|
||||
def _post_new_array(self, expression): |
||||
set_val(expression, []) |
||||
|
||||
def _post_new_contract(self, expression): |
||||
set_val(expression, []) |
||||
|
||||
def _post_new_elementary_type(self, expression): |
||||
set_val(expression, []) |
||||
|
||||
def _post_tuple_expression(self, expression): |
||||
expressions = [get(e) for e in expression.expressions if e] |
||||
val = [item for sublist in expressions for item in sublist] |
||||
set_val(expression, val) |
||||
|
||||
def _post_type_conversion(self, expression): |
||||
expr = get(expression.expression) |
||||
val = expr |
||||
set_val(expression, val) |
||||
|
||||
def _post_unary_operation(self, expression): |
||||
expr = get(expression.expression) |
||||
val = expr |
||||
set_val(expression, val) |
Loading…
Reference in new issue