Ejemplo n.º 1
0
    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
Ejemplo n.º 2
0
    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
Ejemplo n.º 3
0
    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'
Ejemplo n.º 4
0
    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
Ejemplo n.º 5
0
 def LoadData(self, datapath):
     objfile = ObjDataAndBinFile()
     dbcalls = objfile.binfile2objdata(datapath)
     return dbcalls
Ejemplo n.º 6
0
    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'
Ejemplo n.º 7
0
    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
Ejemplo n.º 8
0
    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