Source code for angr.exploration_techniques.dfs
from . import ExplorationTechnique
import random
[docs]class DFS(ExplorationTechnique):
"""
Depth-first search.
Will only keep one path active at a time, any others will be stashed in the 'deferred' stash.
When we run out of active paths to step, we take the longest one from deferred and continue.
"""
def __init__(self, deferred_stash="deferred"):
super().__init__()
self._random = random.Random()
self._random.seed(10)
self.deferred_stash = deferred_stash
[docs] def setup(self, simgr):
if self.deferred_stash not in simgr.stashes:
simgr.stashes[self.deferred_stash] = []
[docs] def step(self, simgr, stash="active", **kwargs):
simgr = simgr.step(stash=stash, **kwargs)
if len(simgr.stashes[stash]) > 1:
self._random.shuffle(simgr.stashes[stash])
simgr.split(from_stash=stash, to_stash=self.deferred_stash, limit=1)
if len(simgr.stashes[stash]) == 0:
if len(simgr.stashes[self.deferred_stash]) == 0:
return simgr
simgr.stashes[stash].append(simgr.stashes[self.deferred_stash].pop())
return simgr