Toggle Light / Dark / Auto color theme
Toggle table of contents sidebar
angr.analyses.decompiler.optimization_passes.call_stmt_rewriter 源代码
from __future__ import annotations
import logging
from ailment.statement import Call , Assignment
from .optimization_pass import OptimizationPass , OptimizationPassStage
_l = logging . getLogger ( name = __name__ )
[文档]
class CallStatementRewriter ( OptimizationPass ):
"""
Rewrite call statements to assignments if needed.
"""
ARCHES = None
PLATFORMS = None
STAGE = OptimizationPassStage . AFTER_MAKING_CALLSITES
NAME = "Unify call statements on demand."
DESCRIPTION = __doc__ . strip ()
[文档]
def __init__ ( self , func , ** kwargs ):
super () . __init__ ( func , ** kwargs )
self . analyze ()
def _check ( self ):
return True , None
def _analyze ( self , cache = None ):
changed = False
for block in self . _graph . nodes :
for idx in range ( len ( block . statements )): # pylint:disable=consider-using-enumerate
stmt = block . statements [ idx ]
if isinstance ( stmt , Call ) and stmt . ret_expr is not None and stmt . fp_ret_expr is None :
src = stmt . copy ()
src . ret_expr = None
new_stmt = Assignment ( stmt . idx , stmt . ret_expr , src , ** stmt . tags )
block . statements [ idx ] = new_stmt
changed = True
if changed :
self . out_graph = self . _graph