'Tries to find all runtime values of this function which do not come from inputs.
These values are generated by starting from a blank state and reanalyzing the basic blocks once each.
Function calls are skipped, and back edges are never taken so these values are often unreliable,
This function is good at finding simple constant addresses which the function will use or calculate.
:return: a set of constants'

@property
def local_runtime_values(self):

    constants = set()
    if (not self._project.loader.main_object.contains_addr(self.addr)):
        return constants
    fresh_state = self._project.factory.blank_state(mode='fastpath')
    fresh_state.regs.ip = self.addr
    graph_addrs = set((x.addr for x in self.graph.nodes() if isinstance(x, BlockNode)))
    analyzed = set()
    q = [fresh_state]
    analyzed.add(fresh_state.se.any_int(fresh_state.ip))
    while (len(q) > 0):
        state = q.pop()
        if (state.se.any_int(state.ip) not in graph_addrs):
            continue
        if self._project.is_hooked(state.se.any_int(state.ip)):
            continue
        if (not self._project.loader.main_object.contains_addr(state.se.any_int(state.ip))):
            continue
        curr_ip = state.se.any_int(state.ip)
        successors = self._project.factory.successors(state)
        for succ in (successors.flat_successors + successors.unsat_successors):
            for a in succ.history.recent_actions:
                for ao in a.all_objects:
                    if (not isinstance(ao.ast, claripy.ast.Base)):
                        constants.add(ao.ast)
                    elif (not ao.ast.symbolic):
                        constants.add(succ.se.any_int(ao.ast))
            if (not succ.se.symbolic(succ.ip)):
                succ_ip = succ.se.any_int(succ.ip)
                if ((succ_ip in self) and (succ_ip not in analyzed)):
                    analyzed.add(succ_ip)
                    q.insert(0, succ)
        node = self.get_node(curr_ip)
        if (node is None):
            continue
        missing = (set((x.addr for x in self.graph.successors(node))) - analyzed)
        for succ_addr in missing:
            l.info('Forcing    jump    to    missing    successor:    %#x', succ_addr)
            if (succ_addr not in analyzed):
                all_successors = ((successors.unconstrained_successors + successors.flat_successors) + successors.unsat_successors)
                if (len(all_successors) > 0):
                    succ = all_successors[0].copy()
                    succ.ip = succ_addr
                    analyzed.add(succ_addr)
                    q.insert(0, succ)
                else:
                    l.warning('Could    not    reach    successor:    %#x', succ_addr)
    return constants
