예제 #1
0
 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            
예제 #2
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