Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def get_predecessor_basic_blocks(self, bb):
if bb.va in self._pred_cache:
for nbb in self._pred_cache[bb.va]:
yield nbb
return
predecessors = []
for xref in get_all_xrefs_to(self.vw, bb.va):
try:
pred = self.bb_by_end[xref[vivisect.const.XR_FROM]]
yield pred
predecessors.append(pred)
except KeyError:
# if we have a jump to the import table,
# the target of the jump is not a basic block in the function.
continue
self._pred_cache[bb.va] = predecessors
def get_successor_basic_blocks(self, bb):
if bb.va in self._succ_cache:
for nbb in self._succ_cache[bb.va]:
yield nbb
return
successors = []
next_va = bb.va + bb.size
op = get_prev_opcode(self.vw, next_va)
for xref in get_all_xrefs_from(self.vw, op.va):
try:
succ = self.bb_by_start[xref[vivisect.const.XR_TO]]
yield succ
successors.append(succ)
except KeyError:
# if we have a jump to the import table,
# the target of the jump is not a basic block in the function.
continue
self._succ_cache[bb.va] = successors