Source code for angr.angrdb.serializers.funcs

from typing import TYPE_CHECKING

from ...knowledge_plugins import FunctionManager, Function
from ..models import DbFunction

if TYPE_CHECKING:
    from angr.knowledge_base import KnowledgeBase
    from angr.angrdb.models import DbKnowledgeBase


[docs]class FunctionManagerSerializer: """ Serialize/unserialize a function manager and its functions. """
[docs] @staticmethod def dump(session, db_kb: "DbKnowledgeBase", func_manager: FunctionManager): """ :param session: :param DbKnowledgeBase db_kb: :param FunctionManager func_manager: :return: """ # remove all existing functions session.query(DbFunction).filter_by(kb=db_kb).delete() for func in func_manager.values(): db_func = DbFunction( kb=db_kb, addr=func.addr, blob=func.serialize(), ) session.add(db_func)
[docs] @staticmethod def load(session, db_kb: "DbKnowledgeBase", kb: "KnowledgeBase"): """ :param session: :param DbKnowledgeBase db_kb: :param KnowledgeBase kb: :return: A loaded function manager. """ funcs = FunctionManager(kb) db_funcs = session.query(DbFunction).filter_by(kb=db_kb) all_func_addrs = set(map(lambda x: x[0], session.query(DbFunction.addr).filter_by(kb=db_kb))) for db_func in db_funcs: func = Function.parse( db_func.blob, function_manager=funcs, project=kb._project, all_func_addrs=all_func_addrs ) funcs[func.addr] = func funcs.rebuild_callgraph() return funcs