mirror of https://github.com/crytic/slither
commit
947c18f5c9
@ -1,96 +0,0 @@ |
||||
from slither.visitors.expression.expression import ExpressionVisitor |
||||
|
||||
from slither.visitors.expression.right_value import RightValue |
||||
|
||||
key = "FindPush" |
||||
|
||||
|
||||
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 |
||||
|
||||
|
||||
class FindPush(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): |
||||
set_val(expression, []) |
||||
|
||||
def _post_index_access(self, expression): |
||||
left = get(expression.expression_left) |
||||
right = get(expression.expression_right) |
||||
val = left + right |
||||
set_val(expression, val) |
||||
|
||||
def _post_literal(self, expression): |
||||
set_val(expression, []) |
||||
|
||||
def _post_member_access(self, expression): |
||||
val = [] |
||||
if expression.member_name == "push": |
||||
right = RightValue(expression.expression) |
||||
val = right.result() |
||||
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) |
@ -1,109 +0,0 @@ |
||||
# Return the 'left' value of an expression |
||||
|
||||
from slither.visitors.expression.expression import ExpressionVisitor |
||||
|
||||
from slither.core.expressions.assignment_operation import AssignmentOperationType |
||||
|
||||
from slither.core.variables.variable import Variable |
||||
|
||||
key = "LeftValue" |
||||
|
||||
|
||||
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 |
||||
|
||||
|
||||
class LeftValue(ExpressionVisitor): |
||||
def result(self): |
||||
if self._result is None: |
||||
self._result = list(set(get(self.expression))) |
||||
return self._result |
||||
|
||||
# overide index access visitor to explore only left part |
||||
def _visit_index_access(self, expression): |
||||
self._visit_expression(expression.expression_left) |
||||
|
||||
def _post_assignement_operation(self, expression): |
||||
if expression.type != AssignmentOperationType.ASSIGN: |
||||
left = get(expression.expression_left) |
||||
else: |
||||
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.value]) |
||||
# elif isinstance(expression.value, SolidityInbuilt): |
||||
# set_val(expression, [expression]) |
||||
else: |
||||
set_val(expression, []) |
||||
|
||||
def _post_index_access(self, expression): |
||||
left = get(expression.expression_left) |
||||
val = left |
||||
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) |
@ -1,115 +0,0 @@ |
||||
# Return the 'right' value of an expression |
||||
# On index access, explore the left |
||||
# on member access, return the member_name |
||||
# a.b.c[d] returns c |
||||
|
||||
from slither.visitors.expression.expression import ExpressionVisitor |
||||
|
||||
from slither.core.expressions.assignment_operation import AssignmentOperationType |
||||
from slither.core.expressions.expression import Expression |
||||
|
||||
from slither.core.variables.variable import Variable |
||||
|
||||
key = "RightValue" |
||||
|
||||
|
||||
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 |
||||
|
||||
|
||||
class RightValue(ExpressionVisitor): |
||||
def result(self): |
||||
if self._result is None: |
||||
self._result = list(set(get(self.expression))) |
||||
return self._result |
||||
|
||||
# overide index access visitor to explore only left part |
||||
def _visit_index_access(self, expression): |
||||
self._visit_expression(expression.expression_left) |
||||
|
||||
def _post_assignement_operation(self, expression): |
||||
if expression.type != AssignmentOperationType.ASSIGN: |
||||
left = get(expression.expression_left) |
||||
else: |
||||
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.value]) |
||||
# elif isinstance(expression.value, SolidityInbuilt): |
||||
# set_val(expression, [expression]) |
||||
else: |
||||
set_val(expression, []) |
||||
|
||||
def _post_index_access(self, expression): |
||||
left = get(expression.expression_left) |
||||
val = left |
||||
set_val(expression, val) |
||||
|
||||
def _post_literal(self, expression): |
||||
set_val(expression, []) |
||||
|
||||
def _post_member_access(self, expression): |
||||
val = [] |
||||
if isinstance(expression.member_name, Expression): |
||||
expr = get(expression.member_name) |
||||
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