def run(self, converteddatapath, datastructname, functionname): print "\n************* %s by %s***************\n" % (functionname, datastructname) objfile = ObjDataAndBinFile() dbcalls = objfile.binfile2objdata(converteddatapath) call_obj = None #默认输出结构体的第一层的结构是一致 if ("1" == functionname): call_obj = dbcalls.callinfolist else: for call in dbcalls.callinfolist: if (call.call_code == functionname): call_obj = call break if call_obj == None: print "没有该函数的信息!\n" return if datastructname == "DataStruct_M": self.trans_by_DataStruct_M(call_obj) return if datastructname == "DataStruct_D": self.trans_by_DataStruct_D(call_obj) return if datastructname == "DataStruct_intrap": self.trans_by_DataStruct_intrap(call_obj) return
def GenVector_1(self, filename): # 将callsite的各参数对应的度量值累加,参数之间存在重复的度量也多次计算;对一个call,将callsites的度量取平均值 objfile = ObjDataAndBinFile() dbcalls = OPS_DataStruct.DbCalls() dbcalls = objfile.binfile2objdata(filename) callinfo = [] args_leaves_num = [] args_cnd_num = [] tmp_args_leaves_num = 0 tmp_args_cnd_num = 0 tmp_call_cnd_num = 0 for call in dbcalls.callinfolist: tmp_args_leaves_num = 0 tmp_args_cnd_num = 0 tmp_call_cnd_num = 0 for callsite in call.callsiteinfolist: tmp_call_cnd_num = tmp_call_cnd_num + len( callsite.callsite_conditionslist) for arginfo in callsite.callsite_argsinfolist: tmp_args_leaves_num = tmp_args_leaves_num + len( arginfo.arg_leavesIdlist) tmp_args_cnd_num = tmp_args_cnd_num + len( arginfo.arg_condIds) #有些类的内部的函数,没能正确获取相关数据,占少数,比例,如370:6596 if (call.callsiteNums != 0): callinfo.append([ call.call_id, call.call_code, call.callsiteNums, round(tmp_call_cnd_num / float(call.callsiteNums), 4), round(tmp_args_leaves_num / float(call.callsiteNums), 4), round(tmp_args_cnd_num / float(call.callsiteNums), 4) ]) return callinfo
def run(self,filename): """" 每类对象的x矢量: 对象实例的预处理力度 pDealIntensity_calleeg. 对象的预处理力度均值 对象的实例个数/代码量总函数实例个数 参数敏感度 对象对参数的内处理力度 """ objfile = ObjDataAndBinFile() dbcalls = DataStruct.DbCalls() dbcalls = objfile.binfile2objdata(filename) callinfo =[] args_leaves_num = [] args_cnd_num = [] tmp_args_leaves_num = 0 tmp_args_cnd_num = 0 for call in dbcalls.callinfolist: tmp_args_leaves_num = 0 tmp_args_cnd_num = 0 for callsite in call.callsiteinfolist: for arginfo in callsite.callsite_argsinfolist: if arginfo.arg_leavesNumsInThisCall > tmp_args_leaves_num: tmp_args_leaves_num = arginfo.arg_leavesNumsInThisCall if arginfo.arg_condNumsInThisCall > tmp_args_cnd_num: tmp_args_cnd_num = arginfo.arg_condNumsInThisCall args_leaves_num.append(tmp_args_leaves_num) args_cnd_num.append(tmp_args_cnd_num) callinfo.append([call.call_id,str(call.call_code),tmp_args_leaves_num,tmp_args_cnd_num]) #print call.call_code , u":" , args_leaves_num , u"-" , args_cnd_num myplot = plot.plot() #myplot.plot(args_leaves_num,args_cnd_num,'max-2d.png') x = range(1,len(callinfo)+1) myplot.plot3d(x,args_leaves_num,args_cnd_num,'max-3d.png') callinfos =sorted(callinfo, key=lambda a : a[2]) f = open('openssl101f-max.txt','w') for callinfo in callinfos: f.write(str(callinfo[0])+str(" _ ")+str(callinfo[1])+str(":")+str(callinfo[2])+str("-")+str(callinfo[3])) f.write('\n') f.close() #print "\n" print 'run() End'
def GenVector_2(self, filename): # 将callsite的各参数对应的度量值累加,参数之间存在重复的度量也多次计算;对一个call,将callsites的度量取平均值 objfile = ObjDataAndBinFile() dbcalls = OPS_DataStruct.DbCalls() dbcalls = objfile.binfile2objdata(filename) callinfo = [] args_leaves_num = [] args_cnd_num = [] tmp_args_leaves_num = 0 tmp_args_cnd_num = 0 tmp_call_cnd_num = 0 for call in dbcalls.callinfolist: tmp_args_leaves_num = 0 tmp_args_cnd_num = 0 tmp_call_cnd_num = 0 for callsite in call.callsiteinfolist: tmp_call_cnd_num = tmp_call_cnd_num + len( callsite.callsite_conditionslist) for arginfo in callsite.callsite_argsinfolist: tmp_args_leaves_num = tmp_args_leaves_num + len( arginfo.arg_leavesIdlist) tmp_args_cnd_num = tmp_args_cnd_num + len( arginfo.arg_condIds) #有些类的内部的函数,没能正确获取相关数据,占少数,比例,如370:6596 if (call.callsiteNums != 0): callinfo.append([ call.call_id, call.call_code, call.callsiteNums, round(tmp_call_cnd_num / float(call.callsiteNums), 4), round(tmp_args_leaves_num / float(call.callsiteNums), 4), round(tmp_args_cnd_num / float(call.callsiteNums), 4) ]) datamax = [callinfo[0][3], callinfo[0][4], callinfo[0][5]] datamin = [callinfo[0][3], callinfo[0][4], callinfo[0][5]] for callitem in callinfo: for i in range(3, len(callitem)): if callitem[i] > datamax[i - 3]: datamax[i - 3] = callitem[i] if callitem[i] < datamin[i - 3]: datamin[i - 3] = callitem[i] for callitem in callinfo: for i in range(3, len(callitem)): if ((datamax[i - 3] - datamin[i - 3]) != 0): callitem[i] = round((callitem[i] - datamin[i - 3]) / (datamax[i - 3] - datamin[i - 3]), 4) print "datamax=:", datamax print "datamin=:", datamin return callinfo
def LoadData(self, datapath): objfile = ObjDataAndBinFile() dbcalls = objfile.binfile2objdata(datapath) return dbcalls
def run(self, filename): """" 每类对象的x矢量: 对象实例的预处理力度 pDealIntensity_calleeg. 对象的预处理力度均值 对象的实例个数/代码量总函数实例个数 参数敏感度 对象对参数的内处理力度 """ objfile = ObjDataAndBinFile() dbcalls = DataStruct.DbCalls() dbcalls = objfile.binfile2objdata(filename) callsinfo = [] for call in dbcalls.callinfolist: num_call_args = 0 avg_args_cnd = 0 avg_args_leaves = 0 #获取call的参数个数,考虑参数个数可变的情况 for callsite in call.callsiteinfolist: if callsite.callsite_argNums > num_call_args: num_call_args = callsite.callsite_argNums tmplist_arg_leaves = [[]] * num_call_args tmplist_arg_cnd = [[]] * num_call_args for t in range(0, num_call_args): tmplist_arg_cnd[t] = [] tmplist_arg_leaves[t] = [] for callsite in call.callsiteinfolist: for i in range(0, callsite.callsite_argNums): tmplist_arg_leaves[i].append( callsite.callsite_argsinfolist[i]. arg_leavesNumsInThisCall) tmplist_arg_cnd[i].append( callsite.callsite_argsinfolist[i]. arg_condNumsInThisCall) argsinfo = [] for j in range(0, num_call_args): avg_args_cnd = sum(tmplist_arg_cnd[j]) / len( tmplist_arg_cnd[j]) avg_args_leaves = sum(tmplist_arg_leaves[j]) / len( tmplist_arg_leaves[j]) argsinfo.append([j, avg_args_leaves, avg_args_cnd]) callsinfo.append([call.call_id, call.call_code, argsinfo]) #print len(callsinfo) #print callsinfo """ myplot = plot.plot() #myplot.plot(args_leaves_num,args_cnd_num) x = range(1,len(callinfo)+1) myplot.plot3d(x,args_leaves_num,args_cnd_num) callinfos =sorted(callinfo, key=lambda a : a[2]) """ f = open('openssl101f-avg.txt', 'w') for callinfo in callsinfo: f.write( str(callinfo[0]) + str(" _ ") + str(callinfo[1]) + str(":") + str(callinfo[2])) f.write('\n') f.close() #print "\n" print 'run() End'
def GenVectorD_10(self, filename): # 将callsite的各参数对应的度量值累加,参数之间存在重复的度量也多次计算;对一个call,将callsites的度量取平均值 objfile = ObjDataAndBinFile() dbcalls = DataStruct_D.DbCalls() dbcalls = objfile.binfile2objdata(filename) callinfo = [] for call in dbcalls.callinfolist: tmp_call_cnd_num = 0 tmp_args_stmtsleft_num = 0 tmp_args_stmtsright_num = 0 tmp_args_stmtscall_num = 0 tmp_args_cnd_num = 0 tmp_args_coleaves_num = 0 tmp_args_cocnds_num = 0 tmp_args_cocnds_list = [] for callsite in call.callsiteinfolist: flag_args_stmtsleft = False flag_args_stmtsright = False flag_args_stmtscall = False flag_args_cnd = False flag_coleaves = False flag_args_cocnds = False if (len(callsite.callsite_conditionslist) > 0): tmp_call_cnd_num += 1 for arginfo in callsite.callsite_argsinfolist: if (len(arginfo.arg_stmtsleftlist) >= 1): flag_args_stmtsleft = True if (len(arginfo.arg_stmtsrightlist) >= 1): flag_args_stmtsright = True if (len(arginfo.arg_stmtiscalllist) >= 1): flag_args_stmtscall = True if (len(arginfo.arg_condidlist) >= 1): flag_args_cnd = True if (flag_args_stmtsleft): tmp_args_stmtsleft_num += 1 if (flag_args_stmtsright): tmp_args_stmtsright_num += 1 if (flag_args_stmtscall): tmp_args_stmtscall_num += 1 if (flag_args_cnd): tmp_args_cnd_num += 1 for i in range(0, len(callsite.callsite_argsinfolist)): for j in range(i + 1, len(callsite.callsite_argsinfolist)): for val_leaf in callsite.callsite_argsinfolist[ i].arg_stmtsleftlist: if val_leaf in callsite.callsite_argsinfolist[ j].arg_stmtsrightlist: flag_coleaves = True #如果处于共同的call中,也视为相互定义 for val_call in callsite.callsite_argsinfolist[ i].arg_stmtiscalllist: if val_call in callsite.callsite_argsinfolist[ j].arg_stmtiscalllist: flag_coleaves = True for val_cnd in callsite.callsite_argsinfolist[ i].arg_condidlist: if val_cnd in callsite.callsite_argsinfolist[ j].arg_condidlist: flag_args_cocnds = True if (flag_coleaves): tmp_args_coleaves_num += 1 flag_coleaves = False if (flag_args_cocnds): tmp_args_cocnds_num += 1 flag_args_cocnds = False #有些类的内部的函数,没能正确获取相关数据,占少数,比例,如370:6596 ''' if (call.callsiteNums != 0): callinfo.append([call.call_id, call.call_code, call.callsiteNums, tmp_call_cnd_num, tmp_args_stmtsleft_num , tmp_args_stmtsright_num , tmp_args_stmtscall_num , tmp_args_cnd_num , tmp_args_coleaves_num , tmp_args_cocnds_num ]) ''' ''' if (call.callsiteNums != 0): callinfo.append([call.call_id, call.call_code, call.callsiteNums, 1 if tmp_args_cnd_num > call.callsiteNums/2 else 0, 1 if tmp_args_coleaves_num > call.callsiteNums/2 else 0, 1 if tmp_args_cocnds_num > call.callsiteNums/2 else 0 ]) ''' ''' if (call.callsiteNums != 0): callinfo.append([call.call_id, call.call_code, call.callsiteNums, round(tmp_call_cnd_num/float(call.callsiteNums),3), round(tmp_args_stmtsleft_num/float(call.callsiteNums),3) , round(tmp_args_stmtsright_num/float(call.callsiteNums),3) , round(tmp_args_stmtscall_num/float(call.callsiteNums),3) , round(tmp_args_cnd_num/float(call.callsiteNums),3) , round(tmp_args_coleaves_num/float(call.callsiteNums),3) , round(tmp_args_cocnds_num/float(call.callsiteNums),3) ]) ''' if (call.callsiteNums != 0): callinfo.append([ call.call_id, call.call_code, call.callsiteNums, round(tmp_args_cnd_num / float(call.callsiteNums), 3), round(tmp_args_coleaves_num / float(call.callsiteNums), 3), round(tmp_args_cocnds_num / float(call.callsiteNums), 3) ]) return callinfo
def GenVector_5(self, filename): # 将callsite的各参数对应的度量值累加,参数之间存在重复的度量也多次计算;对一个call,将callsites的度量取平均值 objfile = ObjDataAndBinFile() dbcalls = OPS_DataStruct.DbCalls() dbcalls = objfile.binfile2objdata(filename) callinfo = [] args_leaves_num = [] args_cnd_num = [] tmp_args_leaves_num = 0 tmp_args_cnd_num = 0 tmp_args_coleaves_num = 0 tmp_args_cocnds_num = 0 tmp_call_cnd_num = 0 for call in dbcalls.callinfolist: tmp_args_leaves_num = 0 tmp_args_cnd_num = 0 tmp_call_cnd_num = 0 for callsite in call.callsiteinfolist: tmp_call_cnd_num = tmp_call_cnd_num + len( callsite.callsite_conditionslist) for arginfo in callsite.callsite_argsinfolist: tmp_args_leaves_num = tmp_args_leaves_num + len( arginfo.arg_leavesIdlist) tmp_args_cnd_num = tmp_args_cnd_num + len( arginfo.arg_condIds) tmp_args_coleaves_list = [] tmp_args_cocnds_list = [] for i in range(0, len(callsite.callsite_argsinfolist)): for j in range(i + 1, len(callsite.callsite_argsinfolist)): if (i != j): for val_leaf in callsite.callsite_argsinfolist[ i].arg_leavesIdlist: if val_leaf in callsite.callsite_argsinfolist[ j].arg_leavesIdlist: tmp_args_coleaves_list.append(val_leaf) for val_cnd in callsite.callsite_argsinfolist[ i].arg_condIds: if val_cnd in callsite.callsite_argsinfolist[ j].arg_condIds: tmp_args_cocnds_list.append(val_cnd) tmp_args_coleaves_num = len(tmp_args_coleaves_list) #未去重 tmp_args_cocnds_num = len(tmp_args_cocnds_list) #未去重 #有些类的内部的函数,没能正确获取相关数据,占少数,比例,如370:6596 if (call.callsiteNums != 0): callinfo.append([ call.call_id, call.call_code, call.callsiteNums, 1 if tmp_call_cnd_num > 0 else 0, 1 if tmp_args_leaves_num > 0 else 0, 1 if tmp_args_cnd_num > 0 else 0, 1 if tmp_args_coleaves_num > 0 else 0, 1 if tmp_args_cocnds_num > 0 else 0 ]) return callinfo