'Iteratively analyze all changed functions, update their returning attribute, until a fix-point is reached (i.e.
no new returning/not-returning functions are found).
:return: None'

def _analyze_all_function_features(self):

    while True:
        new_changes = self._iteratively_analyze_function_features()
        new_returning_functions = new_changes['functions_do_not_return']
        new_not_returning_functions = new_changes['functions_return']
        if ((not new_returning_functions) and (not new_not_returning_functions)):
            break
        for returning_function in new_returning_functions:
            if (returning_function.addr in self._function_returns):
                for fr in self._function_returns[returning_function.addr]:
                    self._changed_functions.add(fr.caller_func_addr)
                    try:
                        return_to_node = self._to_snippet(self._nodes[fr.return_to])
                    except KeyError:
                        return_to_node = fr.return_to
                    self.kb.functions._add_return_from_call(fr.caller_func_addr, fr.callee_func_addr, return_to_node)
                del self._function_returns[returning_function.addr]
        for not_returning_function in new_not_returning_functions:
            if (not_returning_function.addr in self._function_returns):
                for fr in self._function_returns[not_returning_function.addr]:
                    self._changed_functions.add(fr.caller_func_addr)
                    try:
                        call_site_node = self._to_snippet(self._nodes[fr.call_site_addr])
                    except KeyError:
                        call_site_node = fr.call_site_addr
                    try:
                        return_to_node = self._to_snippet(self._nodes[fr.return_to])
                    except KeyError:
                        return_to_node = fr.return_to
                    self.kb.functions._remove_fakeret(fr.caller_func_addr, call_site_node, return_to_node)
                del self._function_returns[not_returning_function.addr]
