一种基于ELF的软件可维护性度量方法与流程

文档序号:33033662发布日期:2023-01-24 18:13阅读:45来源:国知局
一种基于elf的软件可维护性度量方法
技术领域
:1.本发明涉及一种基于elf的软件可维护性度量方法,属于软件工程
技术领域
:。
背景技术
::2.软件复杂度随着需求的变更和功能的演化而持续上升,软件逐渐变得难以理解、修改和测试,软件开发也越来越容易出错。研发人员大量精力被消耗在可维护性陷阱中,而用于改进设计,提升技术,优化实现的时间却被大幅压缩,导致可维护性进一步变差,形成恶性循环。3.在陷入可维护性陷阱这一过程中,大部分软件生产人员是无意识的,少部分虽然有一定感知但却难以精确地描述和量化分散在软件中的各种问题。4.因此,软件可维护性度量应运而生。可维护性度量能够量化地描述软件中的可维护性问题。软件生产各环节可以此为指导,制定债务清理计划,把可维护性债务控制在一定范围之内。5.现有技术中存在一些软件可维护性度量方法:6.1)基于项目管理的方法:统计项目中里程碑的数量,统计历史异常问题数量并对问题进行分类,计算出综合评估。7.2)基于源码分析的方法:统计代码行数,统计变量的定义/使用比值,统计独立代码路径数量,计算出综合评估。8.基于项目管理的方法过于宏观,难以发现更为深层次的原因,对具体问题缺乏有效指导;基于源码分析的方法过于微观,易陷于代码细节,对软件整体情况缺乏合理评估。技术实现要素:9.本发明所要解决的技术问题是提供一种基于elf的软件可维护性度量方法,以elf文件为对象,设计全新分析检测逻辑,能够对待分析软件的可维护性实现高效度量,为待分析软件的进一步设计提供准确依据。10.本发明为了解决上述技术问题采用以下技术方案:本发明设计了一种基于elf的软件可维护性度量方法,用于针对待分析软件的可维护性实现度量,包括如下步骤:11.步骤a.获得待分析软件安装文件中各个elf文件分别对应的符号信息集合,然后进入步骤b;12.步骤b.根据各个elf文件分别对应的符号信息集合,确定各个elf文件分别所依赖的各个其他elf文件,构成各个elf文件分别所对应的目标被依赖文件集合,然后进入步骤c;13.步骤c.基于各个elf文件分别所对应的目标被依赖文件集合,针对对应目标被依赖文件集合不为空的各个elf文件,以elf文件为结点,以elf文件之间的依赖关系为边,且依赖方向为边的方向,构建有向图,然后进入步骤d;14.步骤d.遍历有向图,获得其中环的个数,并计算各结点的入度,定义其中最大入度所对应结点为依赖热点,以及针对有向图中各个连通子图,以连通子图的边数计算子图密度,定义最高子图密度的连通子图为热点区域,然后进入步骤e;15.步骤e.基于有向图,获得待分析软件中各个重复符号、以及其对应的elf文件,并获得待分析软件中各个孤立符号、以及其对应的elf文件,然后进入步骤f;16.步骤f.分别针对有向图中各结点,根据结点的入度、出度,基于该结点入度数与出度数之和,获得该结点出度数与该和的比值,构成该结点对应的外部性系数,进而获得有向图中各结点的外部性系数,并获得其中最大外部性系数,然后进入步骤g;17.步骤g.根据预设有向图中环、重复符号、孤立符号、最大外部性系数分别对应的权重系数,针对有向图中环的个数、重复符号数量、孤立符号数量、以及最大外部性系数进行加权处理,获得待分析软件所对应的债务指数,然后进入步骤h;18.步骤h.基于有向图中各个依赖热点、以及各个热点区域,更新有向图为待分析软件所对应的依赖关系图,并结合待分析软件所对应的债务指数,实现待分析软件可维护性的度量。19.作为本发明的一种优选技术方案:所述步骤a中,分别针对待分析软件安装文件中的各个elf文件,执行如下步骤a1至步骤a3,获得待分析软件安装文件中各个elf文件分别对应的符号信息集合;20.步骤a1.解析elf文件的头信息,获得其中节头表偏移、大小、以及名称字符串索引,然后进入步骤a2;21.步骤a2.针对该elf文件的节头表,遍历节头表,获取节".strtab"和".dynstr"中的名称字符串表起始地址,然后进入步骤a3;22.步骤a3.基于该elf文件节头表中节".strtab"和".dynstr"中的名称字符串表起始地址,解析并记录节".symtab"和".dynamic"中的符号信息,构成该elf文件对应的符号信息集合。23.作为本发明的一种优选技术方案:所述步骤b中,分别针对各个elf文件,将elf文件作为目标elf文件,执行如下步骤b1至步骤b3,确定目标elf文件所对应的目标被依赖文件集合;进而确定各elf文件分别所对应的目标被依赖文件集合;24.步骤b1.基于目标elf文件对应的符号信息集合,获得其中的全局未定义符号集合,然后进入步骤b2;25.步骤b2.基于各个elf文件分别对应的符号信息集合,针对目标elf文件所对应预设包含其所依赖各elf文件的待分析被依赖集合,获得待分析被依赖集合中各个elf文件分别对应的全局可见已定义符号集合,然后进入步骤b3;26.步骤b3.分别针对待分析被依赖集合中各个elf文件,判断elf文件所对应全局可见已定义符号集合与目标elf文件所对应全局未定义符号集合之间的交集是否为空,是则不做任何操作,否则记录目标elf文件依赖于该elf文件;进而由目标elf文件所依赖的各个elf文件,构成目标elf文件所对应的目标被依赖文件集合。27.作为本发明的一种优选技术方案:所述步骤e包括如下步骤e1至步骤e2;28.步骤e1.获得有向图中各个结点分别对应的全局可见已定义符号集合,并针对该各个全局可见已定义符号集合进行取并运算,在取并运算过程中,记录因已存在相同名称而被丢弃的符号、及其对应的结点,构成待分析软件中各个重复符号、以及其对应的elf文件,然后进入步骤e2;29.步骤e2.获得有向图中各个结点分别对应的未定义符号集合,并对该各未定义符号集合进行取并运算,获得并集,以及进一步针针对有向图中各结点全局可见已定义符号集合中的各个符号在该并集中进行查找,记录符号名称查找失败的符号、以及其对应的结点,构成待分析软件中各个孤立符号、以及其对应的elf文件。30.本发明所述一种基于elf的软件可维护性度量方法,采用以上技术方案与现有技术相比,具有以下技术效果:31.本发明所设计一种基于elf的软件可维护性度量方法,引入图理论计算和分析结点依赖关系,首先分析待分析软件安装文件中各elf文件的符号信息,获得各elf文件之间的依赖关系,构建有向图;然后基于有向图获得热点结点、热点区域和外部性系数特征描述,以及发现和统计重复、孤立符号特征描述;最后基于所获各特征描述,实现待分析软件可维护性的度量,为待分析软件的进一步设计提供准确依据;设计方案基于elf的分析更为细致,能直接描述程序内的依赖关系和符号属性,相比源码分析方法,基于elf的分析更为全面,能从软件运行的整体视角描述各模块关系,并且软件规模越大,迭代周期越长,越能体现基于elf量化分析的优势。附图说明32.图1是本发明设计基于elf的软件可维护性度量方法的流程图;33.图2是本发明设计实施例中所绘制依赖关系图示意图。具体实施方式34.下面结合说明书附图对本发明的具体实施方式作进一步详细的说明。35.elf是一种二进制文件标准格式,被广泛应用在类unix操作系统上。elf文件既是最终的代码生成结果,也是程序加载和运行的基本单位。相比项目管理方法,基于elf的分析更为细致,能直接描述程序内的依赖关系和符号属性;相比源码分析方法,基于elf的分析更为全面,能从软件运行的整体视角描述各模块关系。软件规模越大,迭代周期越长,越能体现基于elf量化分析的优势。36.因此,本发明设计了一种基于elf的软件可维护性度量方法,用于针对待分析软件的可维护性实现度量,实际应用当中,如图1所示,具体执行如下步骤a至步骤h。37.步骤a.分别针对待分析软件安装文件中的各个elf文件,具体执行如下步骤a1至步骤a3,获得待分析软件安装文件中各个elf文件分别对应的符号信息集合,然后进入步骤b。38.步骤a1.解析elf文件的头信息,获得其中节头表偏移、大小、以及名称字符串索引,然后进入步骤a2;39.步骤a2.针对该elf文件的节头表,遍历节头表,获取节".strtab"和".dynstr"中的名称字符串表起始地址,然后进入步骤a3;40.步骤a3.基于该elf文件节头表中节".strtab"和".dynstr"中的名称字符串表起始地址,解析并记录节".symtab"和".dynamic"中的符号信息,构成该elf文件对应的符号信息集合。41.步骤b.根据各个elf文件分别对应的符号信息集合,确定各个elf文件分别所依赖的各个其他elf文件,构成各个elf文件分别所对应的目标被依赖文件集合,然后进入步骤c。42.实际应用中,上述步骤b中,分别针对各个elf文件,将elf文件作为目标elf文件,执行如下步骤b1至步骤b3,确定目标elf文件所对应的目标被依赖文件集合;进而确定各elf文件分别所对应的目标被依赖文件集合。43.步骤b1.基于目标elf文件对应的符号信息集合,获得其中的全局未定义符号集合,然后进入步骤b2;44.步骤b2.基于各个elf文件分别对应的符号信息集合,针对目标elf文件所对应预设包含其所依赖各elf文件的待分析被依赖集合,获得待分析被依赖集合中各个elf文件分别对应的全局可见已定义符号集合,然后进入步骤b3;45.步骤b3.分别针对待分析被依赖集合中各个elf文件,判断elf文件所对应全局可见已定义符号集合与目标elf文件所对应全局未定义符号集合之间的交集是否为空,是则不做任何操作,否则记录目标elf文件依赖于该elf文件;进而由目标elf文件所依赖的各个elf文件,构成目标elf文件所对应的目标被依赖文件集合。46.步骤c.基于各个elf文件分别所对应的目标被依赖文件集合,针对对应目标被依赖文件集合不为空的各个elf文件,以elf文件为结点,以elf文件之间的依赖关系为边,且依赖方向为边的方向,构建有向图,然后进入步骤d。47.步骤d.遍历有向图,获得其中环的个数,并计算各结点的入度,定义其中最大入度所对应结点为依赖热点,以及针对有向图中各个连通子图,以连通子图的边数计算子图密度,定义最高子图密度的连通子图为热点区域,然后进入步骤e。48.步骤e.基于有向图,具体执行步骤e1至步骤e2,获得待分析软件中各个重复符号、以及其对应的elf文件,并获得待分析软件中各个孤立符号、以及其对应的elf文件,然后进入步骤f。49.步骤e1.获得有向图中各个结点分别对应的全局可见已定义符号集合,并针对该各个全局可见已定义符号集合进行取并运算,在取并运算过程中,记录因已存在相同名称而被丢弃的符号、及其对应的结点,构成待分析软件中各个重复符号、以及其对应的elf文件,然后进入步骤e2;50.步骤e2.获得有向图中各个结点分别对应的未定义符号集合,并对该各未定义符号集合进行取并运算,获得并集,以及进一步针针对有向图中各结点全局可见已定义符号集合中的各个符号在该并集中进行查找,记录符号名称查找失败的符号、以及其对应的结点,构成待分析软件中各个孤立符号、以及其对应的elf文件。51.步骤f.分别针对有向图中各结点,根据结点的入度、出度,基于该结点入度数与出度数之和,获得该结点出度数与该和的比值,构成该结点对应的外部性系数,进而获得有向图中各结点的外部性系数,并获得其中最大外部性系数,然后进入步骤g。52.步骤g.根据预设有向图中环、重复符号、孤立符号、最大外部性系数分别对应的权重系数,针对有向图中环的个数、重复符号数量、孤立符号数量、以及最大外部性系数进行加权处理,获得待分析软件所对应的债务指数,然后进入步骤h。53.步骤h.基于有向图中各个依赖热点、以及各个热点区域,调用linuxdot命令更新有向图为待分析软件所对应的依赖关系图,并结合待分析软件所对应的债务指数,实现待分析软件可维护性的度量。54.将上述所设计基于elf的软件可维护性度量方法应用于实际当中,待分析软件安装文件目录结构如下表1所示。55.表156.目录名称目录内容描述docreadme.txt软件描述文档目录bindemo_exe可执行elf文件目录liba.sob.soc.sod.sox.so可执行文件依赖的动态库elf文件setupsetup.sh安装脚本目录logdemo.log日志目录57.基于此待分析软件,具体执行所设计基于elf的软件可维护性度量方法,步骤a中,依据linuxelf64的文件格式解析elf二进制文件,先解析elf文件头部,获取头部字段值。58.elf文件主要有3个头结构,分别是elf头(elfheader),程序头(programheader),节头(sectionheader)。节头表(sectionheadertable)由节(section)组成,主要节(section)有".strtab",".dynstr",".symtab"和".dynamic"。59.elf头(elfheader)描述了整个elf文件的基本属性,包括节头表(sectionheadertable)的偏移位置。60.节(section)".strtab"存储了符号表(symboltable)的名称字符串表信息。61.节(section)".dynstr"存储了动态链接符号表(dynamiclinkingsymboltable)的名称字符串表信息。62.节(section)".symtab"存储了符号表(symboltable)信息。63.节(section)".dynamic"存储了动态链接(dynamiclinking)信息。64.符号(symbol)主要指程序中的变量和函数对象,其信息存放在符号表(symboltable)中。65.全局符号指可被elf文件内其他代码文件引用的符号,反之称为局部符号。66.可见符号指可被其他elf文件引用的符号,反之称为不可见符号。67.已定义符号指在elf文件中含有其定义或实现的符号,反之称为未定义符号。68.重复符号指在不同的elf文件中都有定义且名称相同的全局可见符号。69.孤立符号指没有被任何其他elf文件中的符号所引用的全局可见符号。70.表271.[0072][0073]按表2结构解析elf头,使用e_shoff字段值获取节头表起始地址,e_shnum字段值获取节头表成员个数,e_shstrndx字段值获取节名称字符串表起始地址。[0074]表3[0075]类型字段名uint32_tsh_nameuint32_tsh_typeuint64_tsh_flagself64_addrsh_addrelf64_offsh_offsetuint64_tsh_sizeuint32_tsh_linkuint32_tsh_infouint64_tsh_addralignuint64_tsh_entsize[0076]按表3结构从节头表起始地址开始解析节头表成员,使用sh_name获取节名称索引偏移,加上节名称字符串表起始地址可获取节名称,sh_offset获取节内容的起始地址,sh_size获取节内容的大小。[0077]按表3结构从节头表起始地址开始遍历节头表,获取节".strtab"和节".dynstr"内容起始地址,分别为符号表和动态链接符号表的字符串数组起始地址。[0078]按表3结构从节头表起始地址开始遍历节头表,获取节".symtab"符号表起始地址。[0079]表4[0080][0081][0082]按表4结构从节".symtab"符号表起始地址开始遍历符号表,使用st_name字段和符号表字符串数组起始地址获取符号名称,elf64_st_bind(st_info)获取绑定信息,elf64_st_type(st_info)获取类型信息,elf64_st_visibility(st_other)获取可见性信息,st_shndx字段获取符号是否已定义信息。[0083]按表3结构遍历节头表,获取节".dynamic"动态链接表起始地址。[0084]表5[0085][0086]按表5结构从节".dynamic"动态链接表起始地址开始遍历动态链接表,以d_val字段为偏移,加上动态链接符号表字符串数组起始地址,获取当前elf所依赖的其他elf文件名称。[0087]接着执行步骤b,使用elf解析程序解析安装包bin目录下的可执行文件demo_exe,使用广度优先算法逐层遍历以demo_exe为起点的依赖关系链,解析过程如下:[0088]以可执行文件demo_exe为解析起点,解析出其依赖:a.so,b.so,其含有未定义符号:sym1,sym2,sym3。[0089]再解析demo_exe的依赖结点a.so。a.so中已定义符号:sym1,sym2,sym3,含有demo_exe需要引用的未定义符号:sym1,sym2,sym3,所以a.so是demo_exe的有效依赖。[0090]再解析demo_exe的依赖结点b.so。b.so中已定义符号:sym4,sym5,没有demo_exe需要引用的未定义符号,所以b.so是demo_exe的无关依赖。[0091]使用广度优先算法重复以上步骤,逐个解析后续的elf结点,去除每个结点上的无关依赖,结果见表6。[0092]表6[0093]解析elf名称解析的依赖解析的已定义符号解析的未定义符号demo_exea.so,b.sosym1,sym2,sym3a.soc.so,d.sosym1,sym2,sym3sym6,sym7,sym8b.sosym4,sym5c.sox.sosym6,sym7,sym10sym9d.sosym7,sym8x.soc.sosym9sym6[0094]再执行步骤c,按如下表7所示结点件依赖关系,以demo_exe为起点的依赖链上留有结点:demo_exe,a.so,c.so,d.so,x.so,以依赖结点‑‑》被依赖结点为结点间的有向边集合,构造有向图。[0095]表7[0096]依赖结点被依赖结点demo_exea.soa.soc.soa.sod.soc.sox.sox.soc.so[0097]然后执行步骤d,即如下表8所示。[0098]表8[0099]结点入度出度demo_exe01a.so12c.so21d.so10x.so11[0100]获得环计算结果:c.so和x.so间存在依赖环;热点计算结果:c.so为热点结点;热点区域计算结果:由c.so和x.so构成的子图为热点区域。[0101]再执行步骤e,如下表9所示。[0102]表9[0103]结点已定义符号未定义符号demo_exesym1,sym2,sym3a.sosym1,sym2,sym3sym6,sym7,sym8c.sosym6,sym7,sym10sym9d.sosym7,sym8x.sosym9sym6[0104]则获得重复符号:sym7(c.so和d.so),孤立符号:sym10(c.so),以及执行步骤f,执行外部性系数分析,获得下表10所示。[0105]表10[0106]结点外部性系数demo_exe1/(1+0)a.so2/(2+1)c.so1/(1+2)d.so0/(0+1)x.so1/(1+1)[0107]即最大外部性系数为a.so。[0108]最后执行步骤g,获得待分析软件所对应的债务指数,以及执行步骤h,调用linuxdot命令绘制依赖关系图,如图2所示,实现待分析软件可维护性的度量。[0109]在最后的实际应用中,基于最终所获依赖关系图,以及待分析软件所对应的债务指数,实现待分析软件可维护性的度量。并据此获得分别预设对应的影响建议如下表11所示。[0110]表11[0111][0112]上述技术方案所设计一种基于elf的软件可维护性度量方法,引入图理论计算和分析结点依赖关系,首先分析待分析软件安装文件中各elf文件的符号信息,获得各elf文件之间的依赖关系,构建有向图;然后基于有向图获得热点结点、热点区域和外部性系数特征描述,以及发现和统计重复、孤立符号特征描述;最后基于所获各特征描述,实现待分析软件可维护性的度量,为待分析软件的进一步设计提供准确依据;设计方案基于elf的分析更为细致,能直接描述程序内的依赖关系和符号属性,相比源码分析方法,基于elf的分析更为全面,能从软件运行的整体视角描述各模块关系,并且软件规模越大,迭代周期越长,越能体现基于elf量化分析的优势。[0113]上面结合附图对本发明的实施方式作了详细说明,但是本发明并不限于上述实施方式,在本领域普通技术人员所具备的知识范围内,还可以在不脱离本发明宗旨的前提下做出各种变化。当前第1页12当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1