angr.analyses.reaching_definitions 源代码
from __future__ import annotations
from typing import TYPE_CHECKING
from angr.knowledge_plugins.key_definitions import LiveDefinitions
from angr.knowledge_plugins.key_definitions.constants import ObservationPointType
from angr.knowledge_plugins.key_definitions.atoms import (
AtomKind,
Atom,
Register,
MemoryLocation,
Tmp,
GuardUse,
ConstantSrc,
)
from angr.knowledge_plugins.key_definitions.definition import Definition
from angr.analyses import register_analysis
from .reaching_definitions import ReachingDefinitionsAnalysis, ReachingDefinitionsModel
from .function_handler import FunctionHandler, FunctionCallData
from .rd_state import ReachingDefinitionsState
if TYPE_CHECKING:
from angr.storage.memory_object import SimMemoryObject
from angr.storage.memory_mixins import MultiValuedMemory
from angr.storage.memory_mixins.paged_memory.pages import MVListPage
__all__ = (
"Atom",
"AtomKind",
"ConstantSrc",
"Definition",
"FunctionCallData",
"FunctionHandler",
"GuardUse",
"LiveDefinitions",
"MemoryLocation",
"ObservationPointType",
"ReachingDefinitionsAnalysis",
"ReachingDefinitionsModel",
"ReachingDefinitionsState",
"Register",
"Tmp",
"get_all_definitions",
)
[文档]
def get_all_definitions(region: MultiValuedMemory) -> set[Definition]:
all_defs: set[Definition] = set()
# MultiValuedMemory only uses ListPage internally
for page in region._pages.values():
page: MVListPage
for idx in page.stored_offset:
cnt_set: SimMemoryObject | set[SimMemoryObject] | None = page.content[idx]
if cnt_set is None:
continue
if type(cnt_set) is not set:
cnt_set = {cnt_set}
for cnt in cnt_set:
for def_ in LiveDefinitions.extract_defs(cnt.object):
all_defs.add(def_)
return all_defs
register_analysis(ReachingDefinitionsAnalysis, "ReachingDefinitions")