def handleReturnAssgin(self,job_trace_index,i,accesspattern,var): if i+2+1<len(self.l) and isinstance(self.l[i+1],FunctionCallInfo) and isinstance(self.l[i+2],LineOfCode): if self.l[i+1].get_func_name().split("::")[-1].strip() in self.l[i].codestr or self.isMacroCall(i): indexes=self.slice_same_func_lines(i+2, job_trace_index) count=0 print "accesspattern:",accesspattern for idx in indexes[::-1]: print "Line Under Check:", aIndex, "#",self.l[aIndex] if 'return ' in self.l[idx].codestr: self.TG.linkExpandEdges(job_trace_index,idx,"return dependency:"+var.simple_access_str()) #self.TG.linkTraverseEdges(i,idx,"ref:"+var.simple_access_str()) start=re.search(r'return\s*',self.l[idx].codestr).span()[1] rightpart=self.l[idx].codestr[start:].strip().rstrip(';').strip() if Syntax.isUniqueNonLibCall(rightpart): jobs=self.handleReturnAssgin(job_trace_index,idx,accesspattern,var) return self.taintUp(jobs) else: variable_pat=re.compile('^'+Syntax.variable+'$') m=variable_pat.match(rightpart) if m: rfl,p=accesspattern return self.taintUp([TaintJob(idx,TaintVar(rightpart,p,rfl))]) else: taint_v_strs = Filter.expression2vars(rightpart) jobs=map(lambda x : TaintJob(idx,x),[TaintVar(tv,[]) for tv in taint_v_strs]) return self.taintUp(jobs) count+=1 if count == 3:break return [] print "Fatal Error! the malformed call detail lines after return value assignment!" print 1/0
def matchDefinitionType(self,i,var): codestr=self.l[i].codestr if var.v=='i': print "GotIt!!" access=var.accessStr() print "Checking Definition Type for:",access print "codestr:",codestr if Syntax.isForStatement(codestr,access): return Syntax.FOR if Syntax.isIncDef(var.v, codestr): return Syntax.INC #inc operation detection must be before the assignment. #because when detecting variable (i) in case such as: "for (int i=-1;i<m;i++){", #INC result must be returned as ForJobGenerator is only called in handle branch of INC operation #in "lastModification" and "CheckingArgDefinition" function. #This weird behavior need be fixed in future. normal_assginment=Syntax.normal_assignment_pattern(access) match=re.search(normal_assginment,codestr) if match: rightstr=codestr[match.span()[1]:].rstrip(';') if Syntax.isUniqueNonLibCall(rightstr): if i+2+1<len(self.l) and isinstance(self.l[i+1],FunctionCallInfo) and isinstance(self.l[i+2],LineOfCode): if self.l[i+1].get_func_name().split("::")[-1].strip() in self.l[i].codestr: return Syntax.RETURN_VALUE_ASSIGN elif self.isMacroCall(i): return Syntax.RETURN_VALUE_ASSIGN return Syntax.NORMAL_ASSIGN op_assignment=Syntax.op_assignment_pattern(access) if re.search(op_assignment,codestr): return Syntax.OP_ASSIGN raw_definition=r"^\s*\{\s*[A-Za-z_][A-Za-z0-9_]+\s+(\*\s*)*([A-Za-z_][A-Za-z0-9_]+\s*,\s*)*"+var.v+"\s*;" if re.search(raw_definition, codestr): print "We got the raw definition!",codestr return Syntax.RAW_DEF if Syntax.isLibArgDef(var,codestr): return Syntax.SYS_LIB_DEF return Syntax.NODEF