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