Source code for angr.analyses.decompiler.jump_target_collector
# pylint:disable=unused-argument
from typing import Set, Tuple, Optional
import ailment
from .sequence_walker import SequenceWalker
[docs]class JumpTargetCollector:
"""
Collect all jump targets.
"""
[docs] def __init__(self, node):
self.root = node
self.jump_targets: Set[Tuple[int, Optional[int]]] = set()
handlers = {
ailment.Block: self._handle_Block,
}
self._walker = SequenceWalker(handlers=handlers)
self._walker.walk(self.root)
#
# Handlers
#
def _handle_Block(self, block: ailment.Block, **kwargs):
for stmt in block.statements:
if isinstance(stmt, ailment.Stmt.Jump):
if isinstance(stmt.target, ailment.Expr.Const):
self.jump_targets.add((stmt.target.value, stmt.target_idx))
elif isinstance(stmt, ailment.Stmt.ConditionalJump):
if isinstance(stmt.true_target, ailment.Expr.Const):
self.jump_targets.add((stmt.true_target.value, None))
if isinstance(stmt.false_target, ailment.Expr.Const):
self.jump_targets.add((stmt.false_target.value, None))