选取覆盖所有源代码结构的最小代码子集的方法与流程

文档序号:17720785发布日期:2019-05-22 02:08阅读:316来源:国知局
选取覆盖所有源代码结构的最小代码子集的方法与流程

本发明主要涉及航空机载软件验证领域,尤其涉及一种选取覆盖所有源代码结构的最小代码子集的方法。



背景技术:

民用航空机载软件设计中,a级软件作为最高安全等级的软件,必须确保其安全、可靠。

faa和caac均认可do-178c即《机载系统和设备合格审定中的软件考虑》作为机载软件适航取证的标准,针对a级软件明确提出“满足对不可追溯至源代码的额外代码进行验证的目标”。

当前,机载软件功能越来越复杂,规模也越来越大。对于a级软件,需要进行编译器、链接器或者其它工具引入额外代码的识别,在现有的解决方案中,或者基于源代码级结构覆盖测试并补充源码目标码对比分析,或者在目标码级开展结构覆盖分析。目前结合源代码级别的结构覆盖进行源码目标码对比分析有两种方法:1)分析整个软件;2)针对软件编码规则罗列各种可能的规则组合,生成独立的测试程序进行分析。由于待分析软件中会存在相同的程序结构或者待分析软件并不会涉及所有编码规则下结构组合,因此采用这两种方法都会因为存在冗余的语法结构而导致人工识别源码目标码差异的工作量增大。

同时在现有技术中,如cn104360949a公开了一种符合do-178b/ca级软件目标码覆盖分析方法,但是其需要首先通过识别的源码目标码对应关系以及源码目标码的差异来创建编码规则表以及额外映射表,再进行目标码覆盖分析,其未提供具体可操作的典型源代码结构定义和选择算法;cn104461882a公开了一种符合do-178b/ca级的模型验证方法,但其是在模型验证领域中涉及从生成验证程序集选出验证程序子集的方法,此验证程序是与软件测试用例概念相对等的测试操作步骤,不是被验证的软件程序;cn104731587a公开了一种单元测试数据生成方法,通过分析源代码的结构确定测试数据的类型和构造,并生成测试数据,其源码结构分析并不涉及利用其结构分析结果进行源代码子集的选取。

现有的方法,随着软件规模的增大,在“满足对不可追溯至源代码的额外代码进行验证的目标”上,源代码目标码对比分析的工作量和成本将会越来越大。



技术实现要素:

本发明要解决的技术问题是提供一种选取覆盖所有源代码结构的最小代码子集的方法,其能够使在对a级软件进行编译器、链接器或者其它引入额外代码的识别过程中,人工对比分析的工作量为最少。

为解决上述技术问题,本发明提供了一种选取覆盖所有源代码结构的最小代码子集的方法,其包括:a.将待分析软件的源代码按照高级语言、汇编语言和库函数进行分类,得到高级语言代码集合、汇编代码集合和库函数集合;b.对所述高级语言代码集合中的每个函数分析语法结构和编译过程中可能产生附加代码的结构,在确保所述各结构至少被覆盖一次的条件下选出使源代码目标码对比分析的工作量最小的典型结构代码子集;以及c.合并所述典型结构代码子集、所述汇编代码集合和所述库函数集合,以得到所述待分析软件的所述最小代码子集。

在本发明的一实施例中,步骤b包括:b1.对所述每个函数分析语法结构和编译过程中可能产生附加代码的结构,形成所述每个函数与各结构的追溯关系表;b2.对所述各结构进行分类、统一编号,同类结构的编号全局唯一,同时记录所述每个函数对应的源代码目标码对比分析的所述工作量;b3.对所述每个函数的结构编号进行汇总,形成具有结构类别编号、所述工作量的源代码结构分析表;b4.根据所述源代码结构分析表构造结构-函数矩阵;b5.在确保所述各结构至少被覆盖一次的条件下,根据所述结构-函数矩阵和所述每个函数对应的所述工作量构建数学模型;以及b6.对所述数学模型进行求解,选取出使所述工作量最小的所述典型结构代码子集。

在本发明的一实施例中,在步骤b1中,对所述每个函数分析语法结构包括分析函数的返回类型、参数类型、参数个数、基本类型、构造类型、预处理、运算符、过程控制类型和嵌套次数中的一个或多个。

在本发明的一实施例中,在步骤b1中,对所述每个函数分析可能产生附加代码的结构包括分析编译器对代码结构上的处理和/或对代码运行时产生异常的处理。

在本发明的一实施例中,所述编译器对代码结构上的处理包括数组处理、隐式调用库函数和循环结构处理中的一个或多个。

在本发明的一实施例中,所述对代码运行时产生异常的处理包括零除、数据溢出、数组越界和指针地址无效中的一个或多个。

在本发明的一实施例中,所述结构-函数矩阵为:其中,a为结构-函数矩阵,m为结构的个数,n为函数的个数,τ0,τ1,τ2,…,τm-1表示所有函数对应的结构,f0,f1,f2,…,fn-1表示函数,zp,q取值1或0,当取值为1时,代表函数fp覆盖结构τq,当取值为0时,代表函数fp未覆盖结构τq,其中p=0,1,…m-1,q=0,1,…n-1。

在本发明的一实施例中,所述数学模型如下:其中,l=[l0,l1,…,ln-1],ly为分析函数fy时的所述工作量,y=0,1,…,n-1;x=[x0,x1,…,xn-1]t,xi取值1或0,当取值为1时,代表选择函数fi放入所述典型结构代码子集,当取值为0时,代表选择函数fi不放入所述典型结构代码子集,i=0,1,…,n-1,[]t代表矩阵转置;bm×1=[1,1,…,1]t

在本发明的一实施例中,根据所述数学模型求解x,将x中元素为1对应的所述函数放入所述典型结构代码子集。

在本发明的一实施例中,所述工作量为所述函数的源代码的行数。

与现有技术相比,本发明具有以下优点:本发明选取覆盖所有源代码结构的最小代码子集的方法,能够促使最终选取覆盖所有源代码结构的子集为代码行数最少的子集,能够有效减少后续进行源代码目标码差异对比人工分析的工作量和时间成本。

附图说明

图1是本发明一实施例的选取覆盖所有源代码结构的最小代码子集的方法的概要示意图。

图2是本发明一实施例的选取覆盖所有源代码结构的最小代码子集的方法的基本流程图。

图3是本发明一实施例的确定典型结构代码子集的方法的流程图。

具体实施方式

为让本发明的上述目的、特征和优点能更明显易懂,以下结合附图对本发明的具体实施方式作详细说明。

在下面的描述中阐述了很多具体细节以便于充分理解本发明,但是本发明还可以采用其它不同于在此描述的其它方式来实施,因此本发明不受下面公开的具体实施例的限制。

如本申请和权利要求书中所示,除非上下文明确提示例外情形,“一”、“一个”、“一种”和/或“该”等词并非特指单数,也可包括复数。一般说来,术语“包括”与“包含”仅提示包括已明确标识的步骤和元素,而这些步骤和元素不构成一个排它性的罗列,方法或者设备也可能包含其他的步骤或元素。

a级机载软件在满足结构覆盖率目标、识别额外代码过程中,需要人工进行源代码目标码对比分析。为了避免对比分析整个软件,或者对比分析编码规则对应所有结构的程序用例,或者对比分析的是源码子集但代码子集但并不是使源代码目标码对比分析工作量最小的子集,而造成对比分析工作量大,因此本发明在对所有源代码结构进行分析产生源代码结构分析表的基础上,使选出的代码子集不仅覆盖待分析软件的所有结构,并且使后续人工对比分析源代码目标码差异的工作量最少。机载软件中,一般由高级语言、汇编语言和编译器库函数等构成,因此需要按照源代码类型进行分类和分析。机载软件中的高级语言一般以c语言形式的源代码居多,因此下面主要以c语言为例进行说明,但本领域技术人员应了解,本发明中的高级语言还可以例如是c++、java、c#等。

图1是本发明一实施例的选取覆盖所有源代码结构的最小代码子集的方法的概要示意图。请参考图1,本发明的选取覆盖所有源代码结构的最小代码子集的方法概括来说,首先,识别待分析软件源代码的种类,将源代码分为c源代码集合、汇编代码集合和库函数集合,然后在c源代码集合中选取典型结构代码子集,最后合并选取出的典型结构代码子集、汇编代码集合和库函数集合,得到待分析的最小代码子集。

对于a级机载软件,基于验证活动,获取目标码的结构覆盖率,当结构覆盖率无法满足do-178ca级软件的覆盖率要求时,通过对照分析源代码产生额外代码的情形,识别当前测试活动未覆盖的目标码是否是由编译器、链接器或者其它工具引入的额外代码。为减少源代码目标码差异对比人工分析的工作量,本发明提出了如图2所示出的选取覆盖所有源代码结构的最小代码子集的方法。请参考图2,选取覆盖所有源代码结构的最小代码子集的方法10包括:

步骤11:将待分析软件的源代码按照高级语言、汇编语言和库函数进行分类,得到高级语言代码子集、汇编代码子集和库函数子集;

步骤12:对高级语言代码子集中的每个函数分析语法结构和编译过程中可能产生附加代码的结构,在确保各结构至少被覆盖一次的条件下选出使源代码目标码对比分析的工作量最小的典型结构代码子集;

步骤13:合并典型结构代码子集、汇编代码子集和库函数子集,以得到待分析软件的最小代码子集。

在一实施例中,步骤12可通过如图3所示出的确定典型结构代码子集的方法20来实现。确定典型结构代码子集的方法20包括:

步骤21:对每个函数分析语法结构和编译过程中可能产生附加代码的结构,形成每个函数与各结构的追溯关系表;

步骤22:对各结构进行分类、统一编号,同类结构的编号全局唯一,同时记录每个函数对应的源代码目标码对比分析的工作量;

步骤23:对每个函数的结构编号进行汇总,形成具有结构类别编号、工作量的源代码结构分析表;

步骤24:根据源代码结构分析表构造结构-函数矩阵;

步骤25:在确保各结构至少被覆盖一次的条件下,根据结构-函数矩阵和每个函数对应的工作量构建数学模型;

步骤26:对数学模型进行求解,选取出使工作量最小的典型结构代码子集。

在步骤21中,对每个函数分析语法结构可以包括分析函数的返回类型、参数类型、参数个数、基本类型、构造类型、预处理、运算符、过程控制类型和嵌套次数中的一个或多个。

对每个函数分析可能产生附加代码的结构,可以依据编译原理,找出有代表性的可能产生附加代码的结构作为代码子集,主要可以从如下两个方面进行分析:1)编译器对代码结构上的处理,包括数组处理、隐式调用库函数和循环结构处理中的一个或多个,如数组边界的越界检查;2)对代码运行时产生的异常进行处理,包括零除、数据溢出、数组越界和指针地址无效中的一个或多个。

在一更具体的实施例中,步骤21可以以函数所在的文件为单位,为每个文件创建一个二维表,例如excel页表,将文件内的每个函数进行语法结构分析和可能产生额外代码的结构分析,并将分析结果分别填充如下表1所示返回类型、参数类型、参数个数、函数体内的基本类型、构造类型、预处理、运算符、过程控制、产生附加代码的结构等页表中对应结构属性列。例如针对函数voidxyz(void),形成的追溯关系表具体如表1所示。同理分析其它函数形成类似的追溯关系表。

表1函数与各结构的追溯关系表

在完成上述追溯关系表后,还可以对分析结果进行评审,以确保代码结构分析的正确性和完整性。

在一更为具体的实施例中,在步骤22中可以对步骤21的结构分析结果进行汇总,并按照类型分别进行唯一编号,形成如下表2所示的表格。

表2源代码结构分析结果的编码表

在一可选的实施例中,函数对应的源代码目标码对比分析的工作量可以以该函数所具有的代码行数来衡量。

在一更具体的实施例中,在步骤23中将步骤21中所有结构分析的结果按照步骤22的方式分别给属性列添加对应的编号,形成如表3形式的分析表。

表3函数结构分析结果编号后的分析表

在步骤24中,可以从步骤23中的源代码结构分析表中提取所有函数集合f={f0,f1,f2,…,fn-1},所有函数f对应覆盖的结构的最小集合向量t={τ0,τ1,τ2,…,τm-1},并可形成结构-函数矩阵为:

其中,a为结构-函数矩阵,m为结构的个数,n为函数的个数,τ0,τ1,τ2,…,τm-1表示所有函数对应的结构,f0,f1,f2,…,fn-1表示函数,zp,q取值1或0,当取值为1时,代表函数fp覆盖结构τq,当取值为0时,代表函数fp未覆盖结构τq,其中p=0,1,…m-1,q=0,1,…n-1。

对于如表3所示的分析表,所有函数f对应覆盖的语法结构和产生额外代码的结构的最小集合向量t={a.1,b.1,c.1,…,f.5,…,τm-1}。

在步骤25中,在确保各结构至少被覆盖一次的条件下,根据结构-函数矩阵和每个函数对应的工作量构建数学模型如下:

其中,l=[l0,l1,…,ln-1],ly为分析函数fy时的所述工作量,y=0,1,…,n-1;x=[x0,x1,…,xn-1]t,xi取值1或0,当取值为1时,代表选择函数fi放入所述典型结构代码子集,当取值为0时,代表选择函数fi不放入所述典型结构代码子集,i=0,1,…,n-1,[]t代表矩阵转置;bm×1=[1,1,…,1]t。在一可选的实施例中,ly为函数fy的代码行数。

在步骤26中,对上述数学模型进行求解,得到向量x,将x中元素为1对应的函数放入典型结构代码子集,以选取出使工作量最小的典型结构代码子集。

虽然本发明已参照当前的具体实施例来描述,但是本技术领域中的普通技术人员应当认识到,以上的实施例仅是用来说明本发明,在没有脱离本发明精神的情况下还可作出各种等效的变化或替换,因此,只要在本发明的实质精神范围内对上述实施例的变化、变型都将落在本申请的权利要求书的范围内。

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