def__repr__(self):returnf"<CFGManager with {len(self.cfgs)} CFGs>"def__contains__(self,ident):returnidentinself.cfgsdef__getitem__(self,ident)->CFGModel:ifidentnotinself.cfgs:ifself._kbisnotNoneandself._kb._projectisnotNone:is_arm=is_arm_arch(self._kb._project.arch)else:is_arm=Falseself.cfgs[ident]=CFGModel(ident,cfg_manager=self,is_arm=is_arm)returnself.cfgs[ident]def__setitem__(self,ident,model):self.cfgs[ident]=model
[文档]defnew_model(self,prefix):ifprefixnotinself.cfgs:returnself[prefix]# find a unique identi=0whileTrue:ident=f"{prefix}_{i}"ifidentnotinself.cfgs:breaki+=1returnself[ident]
[文档]defget_most_accurate(self)->CFGModel|None:""" :return: The most accurate CFG present in the CFGManager, or None if it does not hold any. """less_accurate_to_most_accurate=["CFGFast","CFGEmulated"]sorted_cfgs_by_prefix=defaultdict(list)forkey,cfg_modelinself.cfgs.items():forprefixinless_accurate_to_most_accurate:ifkey.startswith(prefix):the_prefix=prefixbreakelse:# not foundcontinuesorted_cfgs_by_prefix[the_prefix].append((key,cfg_model))forkeyinreversed(less_accurate_to_most_accurate):ifkeyinsorted_cfgs_by_prefix:lst=sorted(sorted_cfgs_by_prefix[key],key=lambdaitem:item[0])returnlst[-1][-1]returnNone