一种源代码中无效函数的查找方法和设备与流程

文档序号:11216176阅读:327来源:国知局
一种源代码中无效函数的查找方法和设备与流程

本申请涉及互联网信息处理技术及计算机技术领域,尤其涉及一种源代码中无效函数的查找方法和设备。



背景技术:

目前,随着智能终端的普及,智能终端上的各种应用(application,app)也得到了广泛的应用。

对于一款app,随着版本迭代、功能变更、业务增加,该app的源代码不断地增加、修改以及删除,特别是多人开发、长期开发的大型项目,app的源代码中非常容易出现没有被使用的废弃代码(这里可以称之为无效类函数)。

其中,所述无效类函数指app在运行时不再被调用或者引用的函数。由此可见,所述无效类函数是源代码中的冗余部分,会导致app安装包不必要地增大。

为了保证app安装包中所包含的代码得以精简,需要对app的源代码中包含的废弃代码进行查找,例如:对ios系统的objective-c代码中的废弃代码进行查找。

但是,在对objective-c代码中的废弃代码进行查找时,objective-c语言属于一种动态类型语言,具备动态编程语言特性。但是,在编译时无法查找废弃代码,这样导致排查源代码中包含的废弃代码的效率比较低。



技术实现要素:

有鉴于此,本申请实施例提出了一种源代码中无效函数的查找方法和设备,用于解决现有技术中排查源代码中包含的废弃代码存在的效率比较低的问题。

一种源代码中无效函数的查找方法,包括:

提取源代码中包含的函数表达式;

根据预设的函数表达式的引用类型,查找提取到的所述函数表达式对应的引用类型,其中,所述引用类型包含显性引用类型、隐性引用类型;

若查找结果为无法确定所述函数表达式对应的引用类型,则确定提取到的所述函数表达式为无效函数。

一种源代码中无效函数的查找设备,包括:

提取单元,用于提取源代码中包含的函数表达式;

查找单元,用于根据预设的函数表达式的引用类型,查找提取到的所述函数表达式对应的引用类型,其中,所述引用类型包含显性引用类型、隐性引用类型;

确定单元,用于若查找结果为无法确定所述函数表达式对应的引用类型,则确定提取到的所述函数表达式为无效函数。

本申请有益效果如下:

本申请实施例提取源代码中包含的函数表达式;根据预设的函数表达式的引用类型,查找提取到的所述函数表达式对应的引用类型,所述引用类型包含显性引用类型、隐性引用类型;若查找结果为无法确定所述函数表达式对应的引用类型,则确定提取到的所述函数表达式为无效函数。通过提取源代码中包含的函数表达式,进而判断所提取的函数表达式的引用类型,能够有效查找出无效函数,进而能够帮助开发人员有效减小软件安装包的大小,提升排查源代码中包含的废弃代码的效率。

附图说明

为了更清楚地说明本申请实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简要介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域的普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。

图1为本申请实施例提供的一种源代码中无效类型的查找方法的流程示意图;

图2为本申请实施例提供的一种源代码中无效类型的查找设备的结构示意图。

具体实施方式

为了实现本申请的目的,本申请实施例提供了一种源代码中无效函数的查找方法和设备,提取源代码中包含的函数表达式;根据预设的函数表达式的引用类型,查找提取到的所述函数表达式对应的引用类型,所述引用类型包含显性引用类型、隐性引用类型;若查找结果为无法确定所述函数表达式对应的引用类型,则确定提取到的所述函数表达式为无效函数。通过提取源代码中包含的函数表达式,进而判断所提取的函数表达式的引用类型,能够有效查找出无效函数,进而能够帮助开发人员有效减小软件安装包的大小,提升排查源代码中包含的废弃代码的效率。

需要说明的是,本申请实施例中所记载的引用类型的划分类型包含但不限于:一种划分方式为显性应用类型、隐性引用类型、无效类型;另一种划分方式为直接引用类型、委托引用类型、属性应用类型、常量应用类型、系统调用引用类型、特殊应用类型、无效类型;等等。

这里的无效类型包含废弃的、未被引用的函数表达式。

本申请实施例所应用的场景包括但不限于:在对源代码进行编译阶段,即通过编译器将源代码翻译成机器能够识别的代码或者中间代码,也就是从代码到可执行文件的过程中。

下面结合说明书附图对本申请各个实施例作进一步地详细描述。显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本申请保护的范围。

图1为本申请实施例提供的一种源代码中无效类型的查找方法的流程示意 图。所述方法可以如下所示。

步骤101:提取源代码中包含的函数表达式。

在步骤101中,在编译器对源代码进行编译的过程中,可以提取该源代码中包含的函数表达式。

这里的函数表达式可以是指一个函数表达式,也可以是指源代码中包含的多个函数表达式,在本申请实施例中不做具体限定。

这里以源代码是ios系统的代码为例进行说明。

mach内核被next公司的nextstep操作系统使用。在mach内核上,一种可执行的文件格式为mach-o(machobjectfileformat)。ios也同样支持mach-o格式(machobject文件格式)的可执行文件。

mach-o可以分为3个部分:header、segment和section。其中,header后面是segment,segment后面跟着section。segment可能会有多个,,一个segment可以包含多个section。header、segment、section是3种结构体(一种数据结构)。mach-o格式的可执行文件中所包含的程序信息被保存在这3种结构体中。

具体地,header的结构体在fat.h文件中。header定义了整个文件的数据读写方式、指令集信息。数据读写方式说明数据从左还是从右开始读取、每个数据占多少字节。指令集信息说明该可执行文件支持哪些指令集。mach-o格式的可执行文件是个复合文件,一个可执行文件当中可以包含多套的指令集。ios操作系统在启动这个进程的时候会加载最合适的某一套指令集。任何一套指令集的源代码是一致的,所以此处我们任选一套指令集用以分析即可。在选定一套指令集之后,可以得到这套指令集中的segment数据。

segment的结构体在loader.h文件中。segment是信息的大纲,相当于一本书的目录。segment可以有多个,每个都有不同的名字,主要的segment名为_text、_data。每个segment可以有多个section,例如_datasegment有_objc_selrefs、_objc_protolist、_cfstring、_objc_ivar等section,_text segment有_objc_methname、_const、_cstring等section。

section的结构体在loader.h文件中。section是具体某种信息的集合,所有这类信息都在这个结构体中。例如_textsegment的_objc_methnamesection是所有objective-c的方法信息(又可称之为函数信息),_datasegment的_objc_selrefssection是所有objective-c引用的方法信息。

也就是说,对于源代码,可以从mach-o格式的可执行文件中读取函数表达式。

例如:根据_textsegment下的_objc_methnamesection得到可执行文件中所有的函数表达式,保存到_methnames(methodnames,全部函数表达式)数组。

根据_datasegment下的_objc_selrefssection得到可执行文件中被显式引用的函数表达式,保存到_selrefs(selectreferences,引用函数表达式)数组。

根据_datasegment下的_objc_protolistsection得到可执行文件中定义的委托引用类型的函数表达式,保存到_protolists(protocollists,委托函数表达)数组。

根据_datasegment下的_objc_ivarsection得到可执行文件中属性应用类型的函数表达式。xcode编译器根据属性名称自动生成getter函数、setter函数,其getter函数名为属性名,其setter函数名为set+属性名且属性名称首字母大写+英文冒号,例如属性”temp”,其getter方法名为”temp”,其setter方法名为”settemp:”。根据属性计算出对应的getter函数名、setter函数名,并保存到_ivarmeths(ivarmethods,属性函数表达式)数组。

根据_datasegment下的_cfstringsection得到可执行文件中常量引用类型的函数表达式,保存到_cfstrings(corefoundationstrings,常量引用类型的函数表达式)数组。一般字符串常量中包含nsselectorfromstring方式引用的函数表达式,属于隐性引用类型,不容易被检测,但会将函数表达式作为字符串常量记录下来。

步骤102:根据预设的函数表达式的引用类型,查找提取到的所述函数表达式对应的引用类型。

其中,所述引用类型包含显性引用类型、隐性引用类型。

其中,所述隐性引用类型包含委托型引用类型、属性型引用类型、常量型引用类型中至少一种。

在步骤102中,对于提取到的函数表达式,可以判断提取到的所述函数表达式是否属于显性引用类型,或判断提取到的所述函数表达式是否属于隐性引用类型。

例如:根据步骤101中所记载的内容,_methnames数组中保存了源代码中的所有函数表达式,那么从_methnames数组中抽取出一个函数表达式,判断该函数表达式是否属于显性引用类型,若不是,则进一步判断该函数表达式是否属于隐性引用类型;或者,判断该函数表达式是否属于隐性引用类型,若不是,则进一步判断该函数表达式是否属于显性引用类型,这里对于如何判断不做具体限定。

需要说明的是,经过判断之后,无论该函数表达式是否属于无效类函数,将该函数表达式从_methnames数组移除。

也就是说,本申请实施例中所记载的无效类函数的查找方法可以基于_methnames数组,对该_methnames数组进行遍历操作,以找到源代码中包含的无效类函数。

可选地,本申请实施例在判断结果为提取到的所述函数表达式不属于显性引用类型且提取到的所述函数表达式不属于隐性引用类型时,还可以进一步判断提取到的所述函数表达式是否属于白名单中包含的函数表达式。其中,所述白名单中包含的函数表达式为特殊引用类型的函数表达式。

需要说明的是,白名单中包含的函数表达式为特殊引用类型的函数表达式,这里的特殊引用类型的函数表达式包含系统引用类型的函数表达式、用户白名单函数表达式方法,分别从系统函数表达式文件、白名单函数表达式文件 中读入,并保存到_ignoremeths数组。

其中,系统函数表达式文件,中包含由系统调用的系统函数表达式,源代码中一般不调用系统函数表达式,但容易被认为这些函数表达式属于无效函数,因此需要过滤系统函数表达式。

例如:对于mach-o格式的可执行文件,根据_textsegment下的_objc_methnamesection得到可执行文件中包含的所有的系统函数表达式。因系统的ios可执行文件既多又大,分析一次耗时严重。且同一版本的ios系统方法完全一致,没有必要每次分析。因此,单独分析一次系统可执行文件,将得到的系统函数表达式保存到系统函数表达式文件中,使用时只需读取系统函数表达式文件即可。

白名单函数表达式文件,可以是由用户将一些函数表达式(确实未引用但要忽略的函数表达式,例如提供给外部应用调用的接口函数表达式、服务端下发调用的函数表达式等等)添加到白名单函数表达式文件中。

步骤103:若查找结果为无法确定所述函数表达式对应的引用类型,则确定提取到的所述函数表达式为无效函数。

在步骤103中,若判断结果为提取到的所述函数表达式不属于显性引用类型且提取到的所述函数表达式不属于隐性引用类型,则确定查找结果为无法确定所述函数表达式对应的引用类型。

可选地,若判断结果为提取到的所述函数表达式不属于显性引用类型且提取到的所述函数表达式不属于隐性引用类型且判断结果是提取到的所述函数表达式不属于白名单中包含的函数表达式,则确定查找结果为无法确定所述函数表达式对应的引用类型。

下面以从_methnames数组中取出函数表达式为item进行查找说明。

第一步,比对item是否为显性引用类型的函数表达式,即判断_selrefs数组中有无item,如有,则确定其为显性应用类型的函数表达式,结束判断;否则进入下一步判断。

第二步,比对item是否属于delegate(委托型引用类型的函数表达式),即判断_protolists数组中有无item,如有,则确定其为委托型引用类型的函数表达式,结束判断;否则进入下一步判断。

第三步,比对item是否属性的getter、setter(属性型引用类型的函数表达式),即判断_ivarmeths数组中有无item,如有,则确定其为属性型引用类型的函数表达式,结束判断;否则进入下一步判断。

第四步,比对item是否nsselectorfromstring(常量型引用类型的函数表达式),即判断_cfstrings数组中有无item,如有,则确定其为常量型引用类型的函数表达式,结束判断;否则进入下一步判断。

第五步,比对item是否在白名单中,即判断_ignoremeths数组中有无item,如有,则确定其为有效函数,结束判断;否则进入下一步。

第六步,经过层层筛选,进入这步的item就是未引用,即无效函数。

由于只通过第一步得到的无效函数结果,因objective-c语言特性而包含了大量实际被引用的函数,导致准确度非常低,几乎不具有实用性。而结合步骤一至五得到的无效函数结果,准确率几乎100%。

以上步骤中,第一步至第五步的执行顺序可以不分先后,可以调换执行顺序,随机排列组合执行顺序,这里不做限定。

除第一步,其余4个步骤都是可选的。但去掉任一步,都会导致结果准确率大幅降低。

通过本申请实施例所提供的技术方案,提取源代码中包含的函数表达式;根据预设的函数表达式的引用类型,查找提取到的所述函数表达式对应的引用类型,所述引用类型包含显性引用类型、隐性引用类型;若查找结果为无法确定所述函数表达式对应的引用类型,则确定提取到的所述函数表达式为无效函数。通过提取源代码中包含的函数表达式,进而判断所提取的函数表达式的引用类型,能够有效查找出无效函数,进而能够帮助开发人员有效减小软件安装包的大小,提升排查源代码中包含的废弃代码的效率。

图2为本申请实施例提供的一种源代码中无效类型的查找设备的结果示意图。所述查找设备包括:提取单元21、查找单元22和确定单元23,其中:

提取单元21,用于提取源代码中包含的函数表达式;

查找单元22,用于根据预设的函数表达式的引用类型,查找提取到的所述函数表达式对应的引用类型,其中,所述引用类型包含显性引用类型、隐性引用类型;

确定单元23,用于若查找结果为无法确定所述函数表达式对应的引用类型,则确定提取到的所述函数表达式为无效函数。

在本申请的另一个实施例中,所述隐性引用类型包含委托型引用类型、属性型引用类型、常量型引用类型中至少一种。

在本申请的另一个实施例中,所述查找单元22根据预设的函数表达式的引用类型,查找提取到的所述函数表达式对应的引用类型,包括:

判断提取到的所述函数表达式是否属于显性引用类型,或判断提取到的所述函数表达式是否属于隐性引用类型。

在本申请的另一个实施例中,所述查找单元22查找结果为无法确定所述函数表达式对应的引用类型,包括:

若判断结果为提取到的所述函数表达式不属于显性引用类型且提取到的所述函数表达式不属于隐性引用类型,则确定查找结果为无法确定所述函数表达式对应的引用类型。

在本申请的另一个实施例中,所述查找单元22查找结果为无法确定所述函数表达式对应的引用类型,包括:

进一步判断提取到的所述函数表达式是否属于白名单中包含的函数表达式,其中,所述白名单中包含的函数表达式为特殊引用类型的函数表达式;

若判断结果是提取到的所述函数表达式不属于白名单中包含的函数表达式,则确定查找结果为无法确定所述函数表达式对应的引用类型。

需要说明的是,本申请实施例所提供的查找设备可以通过硬件方式实现, 也可以通过软件方式实现,这里不做限定。查找设备提取源代码中包含的函数表达式;根据预设的函数表达式的引用类型,查找提取到的所述函数表达式对应的引用类型,所述引用类型包含显性引用类型、隐性引用类型;若查找结果为无法确定所述函数表达式对应的引用类型,则确定提取到的所述函数表达式为无效函数。通过提取源代码中包含的函数表达式,进而判断所提取的函数表达式的引用类型,能够有效查找出无效函数,进而能够帮助开发人员有效减小软件安装包的大小,提升排查源代码中包含的废弃代码的效率。

本领域的技术人员应明白,本申请的实施例可提供为方法、装置(设备)、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、cd-rom、光学存储器等)上实施的计算机程序产品的形式。

本申请是参照根据本申请实施例的方法、装置(设备)和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。

这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。

这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个 流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。

尽管已描述了本申请的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本申请范围的所有变更和修改。

显然,本领域的技术人员可以对本申请进行各种改动和变型而不脱离本申请的精神和范围。这样,倘若本申请的这些修改和变型属于本申请权利要求及其等同技术的范围之内,则本申请也意图包含这些改动和变型在内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1