Toggle Light / Dark / Auto color theme
Toggle table of contents sidebar
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.
"""
[docs] 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