[文档]classXRef(Serializable):""" XRef describes a reference to a MemoryData instance (if a MemoryData instance is available) or just an address. """__slots__=("block_addr","dst","ins_addr","insn_op_idx","insn_op_type","memory_data","stmt_idx","type",)
[文档]def__init__(self,ins_addr:int|None=None,block_addr:int|None=None,stmt_idx:int|None=None,insn_op_idx:int|None=None,memory_data=None,dst:int|None=None,xref_type=None,):ifdstisnotNoneandnotisinstance(dst,int):raiseTypeError(f"XRefs must be pointing to a constant target. Target {dst!r} is not supported.")# srcself.ins_addr:int|None=ins_addrself.insn_op_idx:int|None=insn_op_idxself.block_addr:int|None=block_addrself.stmt_idx:int|None=stmt_idx# dstself.memory_data=memory_data# optionalself.dst=dstself.type=xref_typeifmemory_dataisnotNoneanddstisNone:self.dst=memory_data.addr
[文档]@classmethoddefparse_from_cmessage(cls,cmsg,bits=None,**kwargs):# pylint:disable=arguments-differ# Note that we cannot recover _memory_data from cmsg# delayed importfromangr.engines.lightimportSpOffset# pylint:disable=import-outside-toplevelifnotisinstance(bits,int):raiseTypeError("bits must be provided.")ifcmsg.target_type==primitives_pb2.CodeReference.StackTarget:# pylint:disable=no-memberdst=SpOffset(bits,cmsg.data_ea,is_base=False)else:dst=cmsg.data_eareturnXRef(ins_addr=cmsg.ea,block_addr=cmsg.block_ea,stmt_idx=cmsg.stmt_idx,insn_op_idx=Noneifcmsg.operand_idx==-1elsecmsg.operand_idx,dst=dst,xref_type=cmsg.ref_type,)