angr/tests/sim/test_find_avoid_conflict.py
Kevin Phoenix f939c5b88c
Enable ruff isort rule (#6452)
* Enable ruff isort rule

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2026-06-02 14:48:07 -07:00

41 lines
1.5 KiB
Python

from __future__ import annotations
import os
import unittest
import angr
from tests.common import bin_location
# pylint: disable=missing-class-docstring
# While exploring, if the 'find' and 'avoid' addresses occur in the same run
# the path is added to find_stash even if the avoid address occurs first.
# This is not an entirely trivial issue since a run can span several basic
# blocks. In the following example, main contains an if-then-else statement.
# We want to reach the end of main while avoiding the else branch. It is not
# rejected by angr because there is no control flow instruction at the assembly
# level between the start of the else branch and the target address.
class TestFindAvoidConflict(unittest.TestCase):
def test_find_avoid_conflict(self):
proj = angr.Project(os.path.join(bin_location, "tests", "i386", "ite_FindAvoidConflict-O3"))
initial_state = proj.factory.blank_state()
sm = proj.factory.simulation_manager(initial_state)
targetAddr = 0x8048390
avoidAddr = 0x804838B
while len(sm.active) > 0:
sm.explore(find=targetAddr, avoid=avoidAddr)
for state in sm.found:
for addr in state.history.bbl_addrs:
try:
instAddrs = set(proj.factory.block(addr).instruction_addrs)
except angr.errors.AngrError:
instAddrs = {}
self.assertNotIn(avoidAddr, instAddrs)
if __name__ == "__main__":
unittest.main()