(self, node, state: ReachingDefinitionsState)
:param node:    The current node.
        :param state:   The analysis state.
        :return:        A tuple: (reached fix-point, successor state)
def _run_on_node(self, node, state: ReachingDefinitionsState):
        """

        :param node:    The current node.
        :param state:   The analysis state.
        :return:        A tuple: (reached fix-point, successor state)
        """

        self._visited_blocks.add(node)

        engine: SimEngineLight

        if isinstance(node, ailment.Block):
            block = node
            engine = self._engine_ail
        elif isinstance(node, (Block, CodeNode)):
            block = self.project.factory.block(node.addr, node.size, opt_level=1, cross_insn_opt=False)
            engine = self._engine_vex
        elif isinstance(node, CFGNode):
            if node.is_simprocedure or node.is_syscall:
                return False, state.copy()
            block = node.block
            engine = self._engine_vex
        else:
            l.warning("Unsupported node type %s.", node.__class__)
            return False, state.copy()

        self.node_observe(node.addr, state, OP_BEFORE)

        state = state.copy()
        state, self._visited_blocks, self._dep_graph = engine.process(
            state,
            block=block,
            fail_fast=self._fail_fast,
            visited_blocks=self._visited_blocks,
            dep_graph=self._dep_graph,
        )

        block_key = node.addr
        self._node_iterations[block_key] += 1

        self.node_observe(node.addr, state, OP_AFTER)

        # update all definitions and all uses
        self.all_definitions |= state.all_definitions
        for use in [state.stack_uses, state.heap_uses, state.register_uses]:
            self.all_uses.merge(use)

        if self._node_iterations[block_key] < self._max_iterations:
            return True, state
        else:
            return False, state
def _run_on_node ( self , node , state : ReachingDefinitionsState ) : self . _visited_blocks . add ( node ) engine : SimEngineLight if isinstance ( node , ailment . Block ) : block = node engine = self . _engine_ail elif isinstance ( node , ( Block , CodeNode ) ) : block = self . project . factory . block ( node . addr , node . size , opt_level = 1 , cross_insn_opt = False ) engine = self . _engine_vex elif isinstance ( node , CFGNode ) : if node . is_simprocedure or node . is_syscall : return False , state . copy ( ) block = node . block engine = self . _engine_vex else : l . warning ( "Unsupported node type %s." , node . __class__ ) return False , state . copy ( ) self . node_observe ( node . addr , state , OP_BEFORE ) state = state . copy ( ) state , self . _visited_blocks , self . _dep_graph = engine . process ( state , block = block , fail_fast = self . _fail_fast , visited_blocks = self . _visited_blocks , dep_graph = self . _dep_graph , ) block_key = node . addr self . _node_iterations [ block_key ] += 1 self . node_observe ( node . addr , state , OP_AFTER ) # update all definitions and all uses self . all_definitions |= state . all_definitions for use in [ state . stack_uses , state . heap_uses , state . register_uses ] : self . all_uses . merge ( use ) if self . _node_iterations [ block_key ] < self . _max_iterations : return True , state else : return False , state