mirror of https://github.com/crytic/slither
add phi_callback for state variablepull/87/head
parent
e25be40be4
commit
767e01ec2c
@ -0,0 +1,37 @@ |
|||||||
|
''' |
||||||
|
Nodes of the dominator tree |
||||||
|
''' |
||||||
|
|
||||||
|
from slither.core.children.child_function import ChildFunction |
||||||
|
|
||||||
|
class DominatorNode(object): |
||||||
|
|
||||||
|
def __init__(self): |
||||||
|
self._succ = set() |
||||||
|
self._nodes = [] |
||||||
|
|
||||||
|
def add_node(self, node): |
||||||
|
self._nodes.append(node) |
||||||
|
|
||||||
|
def add_successor(self, succ): |
||||||
|
self._succ.add(succ) |
||||||
|
|
||||||
|
@property |
||||||
|
def cfg_nodes(self): |
||||||
|
return self._nodes |
||||||
|
|
||||||
|
@property |
||||||
|
def sucessors(self): |
||||||
|
''' |
||||||
|
Returns: |
||||||
|
dict(Node) |
||||||
|
''' |
||||||
|
return self._succ |
||||||
|
|
||||||
|
class DominatorTree(ChildFunction): |
||||||
|
|
||||||
|
def __init__(self, entry_point): |
||||||
|
super(DominatorTree, self).__init__() |
||||||
|
|
||||||
|
|
||||||
|
|
@ -0,0 +1,41 @@ |
|||||||
|
import logging |
||||||
|
|
||||||
|
from slither.core.variables.variable import Variable |
||||||
|
from slither.slithir.variables import TupleVariable |
||||||
|
from slither.core.declarations.function import Function |
||||||
|
from slither.slithir.utils.utils import is_valid_lvalue, is_valid_rvalue |
||||||
|
from .phi import Phi |
||||||
|
|
||||||
|
class PhiCallback(Phi): |
||||||
|
|
||||||
|
def __init__(self, left_variable, nodes): |
||||||
|
assert is_valid_lvalue(left_variable) |
||||||
|
assert isinstance(nodes, set) |
||||||
|
super(PhiCallback, self).__init__(left_variable, nodes) |
||||||
|
|
||||||
|
@property |
||||||
|
def read(self): |
||||||
|
return [self.rvalues] |
||||||
|
|
||||||
|
@property |
||||||
|
def rvalues(self): |
||||||
|
return self._rvalues |
||||||
|
|
||||||
|
@property |
||||||
|
def rvalue_no_callback(self): |
||||||
|
''' |
||||||
|
rvalue if callback are not considered |
||||||
|
''' |
||||||
|
return self._rvalues[0] |
||||||
|
|
||||||
|
@rvalues.setter |
||||||
|
def rvalues(self, vals): |
||||||
|
self._rvalues = vals |
||||||
|
|
||||||
|
|
||||||
|
@property |
||||||
|
def nodes(self): |
||||||
|
return self._nodes |
||||||
|
|
||||||
|
def __str__(self): |
||||||
|
return '{}({}) := \u03D5({})'.format(self.lvalue, self.lvalue.type, [v.ssa_name for v in self._rvalues]) |
Loading…
Reference in new issue