# Buggy code
def _run_on_node(self, node, state):
    """


    :param angr.Block node:
    :param VariableRecoveryState state:
    :return:
    """

    l.debug(
        "Analyzing block %#x, iteration %d.", node.addr, self._node_iterations[node]
    )

    concrete_state = state.get_concrete_state(node.addr)

    if concrete_state is None:
        # didn't find any state going to here
        l.error("_run_on_node(): cannot find any state for address %#x.", node.addr)
        return False, state

    state = state.copy()

    if self._node_iterations[node] >= self._max_iterations:
        l.debug(
            "Skip node %s as we have iterated %d times on it.",
            node,
            self._node_iterations[node],
        )
        return False, state

    state.register_callbacks([concrete_state])

    successors = self.project.factory.successors(
        concrete_state,
        addr=node.addr,
        size=node.size,
        opt_level=0,  # disable the optimization in order to have
        # instruction-level analysis results
    )
    output_states = successors.all_successors

    state.concrete_states = output_states

    self._node_to_state[node.addr] = state

    self._node_iterations[node] += 1

    return True, state


# Traceback (AttributeError)
Traceback (most recent call last):
File "angr-dev/blah.py", line 4, in <module>
vr = p.analyses.VariableRecovery(cfg.functions.function(name='main'))
File "angr-dev/angr/angr/analyses/analysis.py", line 108, in __call__
oself.__init__(*args, **kwargs)
File "angr-dev/angr/angr/analyses/variable_recovery/variable_recovery.py", line 416, in __init__
self._analyze()
File "angr-dev/angr/angr/analyses/forward_analysis.py", line 557, in _analyze
self._analysis_core_graph()
File "angr-dev/angr/angr/analyses/forward_analysis.py", line 580, in _analysis_core_graph
changed, output_state = self._run_on_node(n, job_state)
File "angr-dev/angr/angr/analyses/variable_recovery/variable_recovery.py", line 461, in _run_on_node
concrete_state = state.get_concrete_state(node.addr)
File "angr-dev/angr/angr/analyses/variable_recovery/variable_recovery.py", line 62, in get_concrete_state
if s.ip._model_concrete.value == addr:
File "angr-dev/claripy/claripy/ast/base.py", line 951, in __getattr__
raise AttributeError(a)
AttributeError: value

# Fixed code
def _run_on_node(self, node, state):
    """


    :param angr.Block node:
    :param VariableRecoveryState state:
    :return:
    """

    l.debug(
        "Analyzing block %#x, iteration %d.", node.addr, self._node_iterations[node]
    )

    concrete_state = state.get_concrete_state(node.addr)

    if concrete_state is None:
        # didn't find any state going to here
        l.error("_run_on_node(): cannot find any state for address %#x.", node.addr)
        return False, state

    state = state.copy()

    if self._node_iterations[node] >= self._max_iterations:
        l.debug(
            "Skip node %s as we have iterated %d times on it.",
            node,
            self._node_iterations[node],
        )
        return False, state

    state.register_callbacks([concrete_state])

    successors = self.project.factory.successors(
        concrete_state,
        addr=node.addr,
        size=node.size,
        opt_level=0,  # disable the optimization in order to have
        # instruction-level analysis results
    )
    output_states = successors.all_successors

    state.concrete_states = [state for state in output_states if not state.ip.symbolic]

    self._node_to_state[node.addr] = state

    self._node_iterations[node] += 1

    return True, state