Skip to content

Commit

Permalink
update vyper cfg to include reachability (#2182)
Browse files Browse the repository at this point in the history
* update vyper cfg to include reachability

* revert #2170
  • Loading branch information
0xalpharush authored Oct 17, 2023
1 parent e3346c0 commit 46be017
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 14 deletions.
26 changes: 12 additions & 14 deletions slither/core/dominators/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,20 +10,19 @@ def intersection_predecessor(node: "Node") -> Set["Node"]:
if not node.fathers:
return set()

# Revert PR1984
ret = node.fathers[0].dominators
for pred in node.fathers[1:]:
ret = ret.intersection(pred.dominators)
# if not any(father.is_reachable for father in node.fathers):
# return set()
#
# ret = set()
# for pred in node.fathers:
# ret = ret.union(pred.dominators)
#
# for pred in node.fathers:
# if pred.is_reachable:
# ret = ret.intersection(pred.dominators)
if not any(father.is_reachable for father in node.fathers):
return set()

ret = set()
for pred in node.fathers:
ret = ret.union(pred.dominators)

for pred in node.fathers:
if pred.is_reachable:
ret = ret.intersection(pred.dominators)
return ret


Expand Down Expand Up @@ -96,9 +95,8 @@ def compute_dominance_frontier(nodes: List["Node"]) -> None:
for node in nodes:
if len(node.fathers) >= 2:
for father in node.fathers:
# Revert PR1984
# if not father.is_reachable:
# continue
if not father.is_reachable:
continue
runner = father
# Corner case: if there is a if without else
# we need to add update the conditional node
Expand Down
7 changes: 7 additions & 0 deletions slither/vyper_parsing/declarations/function.py
Original file line number Diff line number Diff line change
Expand Up @@ -184,6 +184,7 @@ def analyze_content(self) -> None:
self._function.is_implemented = True
self._function.is_empty = False
self._parse_cfg(body)
self._update_reachability(self._function.entry_point)
else:
self._function.is_implemented = False
self._function.is_empty = True
Expand Down Expand Up @@ -243,6 +244,12 @@ def _new_node(
# region Parsing function
###################################################################################
###################################################################################
def _update_reachability(self, node: Node) -> None:
if node.is_reachable:
return
node.set_is_reachable(True)
for son in node.sons:
self._update_reachability(son)

# pylint: disable=too-many-branches,too-many-statements,protected-access,too-many-locals
def _parse_cfg(self, cfg: List[ASTNode]) -> None:
Expand Down

0 comments on commit 46be017

Please sign in to comment.