[docs]classStaticFindMixin(SmartFindMixin):# pylint:disable=abstract-method""" Implements data finding for abstract memory. """
[docs]deffind(self,addr,data,max_search,default=None,endness=None,chunk_size=None,max_symbolic_bytes=None,condition=None,char_size=1,**kwargs,):# pylint:disable=arguments-differifendnessisNone:endness=self.endnessifendnessisNone:endness="Iend_BE"char_num=self._calc_char_num(data,char_size)# chunk_size is the number of bytes to cache in memory for comparisonifchunk_sizeisNone:chunk_size=min(max_search,max(0x80,char_num))match_indices=[]fori,(_,element)inenumerate(self._find_iter_items(addr,char_num,char_size,chunk_size,max_search,endness,condition,max_symbolic_bytes,**kwargs)):comparison,concrete_comparison=self._find_compare(element,data,**kwargs)ifcomparison:match_indices.append(i)ifconcrete_comparisonisTrue:breakr_union=claripy.ESI(self.state.arch.bits)forindexinmatch_indices:r_union=r_union.union(addr+index)returnr_union,[],match_indices
def_find_compare(self,element,target,**kwargs):elem_si=element._model_vsa# pylint:disable=protected-accesstarget_si=target._model_vsa# pylint:disable=protected-accesscomparison,concrete_comparison=False,False# we only support strided intervalsifisinstance(elem_si,claripy.vsa.StridedInterval):comparison=notelem_si.intersection(target_si).is_emptyconcrete_comparison=elem_si.identical(target_si)returncomparison,concrete_comparisondef_find_are_bytes_symbolic(self,b):# we only support strided intervalsreturnnotisinstance(b._model_vsa,claripy.vsa.StridedInterval)# pylint:disable=protected-access