8000 Phoenix: Remove a memo-based hack in short-circuit matching. by ltfish · Pull Request #5521 · angr/angr · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

Phoenix: Remove a memo-based hack in short-circuit matching. #5521

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jun 12, 2025
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 19 additions & 32 deletions angr/analyses/decompiler/structuring/phoenix.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
import claripy
from angr.ailment.block import Block
from angr.ailment.statement import Statement, ConditionalJump, Jump, Label, Return
from angr.ailment.expression import Const, UnaryOp, MultiStatementExpression
from angr.ailment.expression import Const, UnaryOp, MultiStatementExpression, BinaryOp

from angr.utils.graph import GraphUtils
from angr.utils.ail import is_phi_assignment, is_head_controlled_loop_block
Expand Down Expand Up @@ -2174,20 +2174,17 @@ def _match_acyclic_short_circuit_conditions(
if r is not None:
left, left_cond, right, left_right_cond, succ = r
# create the condition node
memo = {}
left_cond_expr = self.cond_proc.convert_claripy_bool_ast(left_cond)
left_cond_expr_neg = UnaryOp(None, "Not", left_cond_expr, ins_addr=start_node.addr)
left_right_cond_expr = self.cond_proc.convert_claripy_bool_ast(left_right_cond)
if not self._is_single_statement_block(left):
if not self._should_use_multistmtexprs(left):
return False
# create a MultiStatementExpression for left_right_cond
stmts = self._build_multistatementexpr_statements(left)
assert stmts is not None
mstmt_expr = MultiStatementExpression(
None, stmts, self.cond_proc.convert_claripy_bool_ast(left_right_cond), ins_addr=left.addr
)
memo[left_right_cond._hash] = mstmt_expr
cond = self.cond_proc.convert_claripy_bool_ast(
claripy.Or(claripy.Not(left_cond), left_right_cond), memo=memo
)
left_right_cond_expr = MultiStatementExpression(None, stmts, left_right_cond_expr, ins_addr=left.addr)
cond = BinaryOp(None, "LogicalOr", [left_cond_expr_neg, left_right_cond_expr], ins_addr=start_node.addr)
cond_jump = ConditionalJump(
None,
cond,
Expand All @@ -2212,18 +2209,16 @@ def _match_acyclic_short_circuit_conditions(
if r is not None:
left, left_cond, right, right_left_cond, else_node = r
# create the condition node
memo = {}
left_cond_expr = self.cond_proc.convert_claripy_bool_ast(left_cond)
right_left_cond_expr = self.cond_proc.convert_claripy_bool_ast(right_left_cond)
if not self._is_single_statement_block(right):
if not self._should_use_multistmtexprs(right):
return False
# create a MultiStatementExpression for left_right_cond
stmts = self._build_multistatementexpr_statements(right)
assert stmts is not None
mstmt_expr = MultiStatementExpression(
None, stmts, self.cond_proc.convert_claripy_bool_ast(right_left_cond), ins_addr=left.addr
)
memo[right_left_cond._hash] = mstmt_expr
cond = self.cond_proc.convert_claripy_bool_ast(claripy.Or(left_cond, right_left_cond), memo=memo)
right_left_cond_expr = MultiStatementExpression(None, stmts, right_left_cond_expr, ins_addr=left.addr)
cond = BinaryOp(None, "LogicalOr", [left_cond_expr, right_left_cond_expr], ins_addr=start_node.addr)
cond_jump = ConditionalJump(
None,
cond,
Expand All @@ -2248,20 +2243,17 @@ def _match_acyclic_short_circuit_conditions(
if r is not None:
left, left_cond, succ, left_succ_cond, right = r
# create the condition node
memo = {}
left_cond_expr = self.cond_proc.convert_claripy_bool_ast(left_cond)
left_succ_cond_expr = self.cond_proc.convert_claripy_bool_ast(left_succ_cond)
if not self._is_single_statement_block(left):
if not self._should_use_multistmtexprs(left):
return False
# create a MultiStatementExpression for left_right_cond
stmts = self._build_multistatementexpr_statements(left)
assert stmts is not None
mstmt_expr = MultiStatementExpression(
None, stmts, self.cond_proc.convert_claripy_bool_ast(left_succ_cond), ins_addr=left.addr
)
memo[left_succ_cond._hash] = mstmt_expr
cond = self.cond_proc.convert_claripy_bool_ast(
claripy.And(left_cond, claripy.Not(left_succ_cond)), memo=memo
)
left_succ_cond_expr = MultiStatementExpression(None, stmts, left_succ_cond_expr, ins_addr=left.addr)
left_succ_cond_expr_neg = UnaryOp(None, "Not", left_succ_cond_expr, ins_addr=start_node.addr)
cond = BinaryOp(None, "LogicalAnd", [left_cond_expr, left_succ_cond_expr_neg], ins_addr=start_node.addr)
cond_jump = ConditionalJump(
None,
cond,
Expand All @@ -2285,21 +2277,16 @@ def _match_acyclic_short_circuit_conditions(
if r is not None:
left, left_cond, right, right_left_cond, else_node = r
# create the condition node
memo = {}
left_cond_expr = self.cond_proc.convert_claripy_bool_ast(left_cond)
left_right_cond_expr = self.cond_proc.convert_claripy_bool_ast(right_left_cond)
if not self._is_single_statement_block(left):
if not self._should_use_multistmtexprs(left):
return False
# create a MultiStatementExpression for left_right_cond
stmts = self._build_multistatementexpr_statements(left)
assert stmts is not None
mstmt_expr = MultiStatementExpression(
None, stmts, self.cond_proc.convert_claripy_bool_ast(right_left_cond), ins_addr=left.addr
)
memo[right_left_cond._hash] = mstmt_expr
cond = self.cond_proc.convert_claripy_bool_ast(
claripy.And(left_cond, right_left_cond),
memo=memo,
)
left_right_cond_expr = MultiStatementExpression(None, stmts, left_right_cond_expr, ins_addr=left.addr)
cond = BinaryOp(None, "LogicalAnd", [left_cond_expr, left_right_cond_expr], ins_addr=start_node.addr)
cond_jump = ConditionalJump(
None,
cond,
Expand Down
Loading
0