苌瑶,陆志肖,吴丽媛,宋治惠,胡尊帆
(中国直升机设计研究所 机电软件专业,天津,300300)
航空电子技术不断发展,现代飞机的体系架构已逐渐向模块化、高度综合化方向发展,软件实现的功能在航空电子系统中的地位越来越重要。航空机载软件具有嵌入式、实时性、结构复杂、高安全关键等级等特点[1],航空机载软件可靠性决定了航空电子系统乃至整个航空器的质量[2],成了机载设备发挥其优越性能的一个制约因素。软件测试是保障航空机载软件可靠性的重要手段[3],也是机载软件全生存周期缺陷管理和分析的关键环节[4]。
机载软件质量的影响因素有很多,应通过提高软件测试的充分性,在开发阶段和测试阶段都进行充分的软件测试,以尽早发现软件问题,从而提高软件的可靠性。而软件测试的工作量很大,据统计,测试时间会占到总开发周期时间的40%~60%。测试的许多操作和过程是重复性的,因此在整个软件过程中软件测试可以应用自动化的测试工具,提高测试的速度、效率和准确度[5]。
航空机载软件开发过程周期较长,即使软件开发完成后也很难立刻使用目标机进行测试,且开发人员和测试人员不能同时进行测试[6]。航空机载软件一般使用C 语言编写,C语言是一个功能强大且高度灵活的编程语言,被广泛应用于各种嵌入式系统中,但灵活的同时也容易被开发人员误用导致代码存在运行时错误。运行时错误是指那些能导致预定义之外的不正确结果或者处理器停机的错误,它是所有的软件错误中最具风险的,如数组越界、整数被零除、值溢出、非法的指针访问等。一旦发生轻则导致软件不能正常运行,重则导致系统崩溃。根据IBM-Berkeley 调查统计,在每一千行的代码中大约就会发现一个运行时错误,而且在软件的维护阶段所检测到的错误中有30%~40%是运行时错误,可见运行时错误对软件质量的影响较大。而软件中的运行时错误是很难被发现的,采用传统的测试工具不能检测到或很难检测到软件运行时错误,这对于可靠性要求极高的机载软件存在巨大风险。因此我们应当采取一些措施及时发现并消除这类代码的运行时错误,在开发阶段的初期对代码进行运行时错误检查,可以避免在后期测试和产品维护阶段发现更多的问题。使用运行时错误检查工具,能够快速地、自动化地检测到软件中的运行时错误,且能尽早地检测到运行时错误,能够节省测试阶段的时间和费用,极大地提高了软件可靠性。本文针对机载软件难以在开发初期检测出运行时错误的问题,使用Astree 对代码进行测试分析。通过测试可尽早发现软件开发过程的中的运行时错误,以提高代码的开发效率,从而有效避免了软件在机载产品上出现严重的质量问题。
1.1 Astree 软件测试方法
Astree 是一个静态程序分析器,用于检查C 语言程序中是否存在运行时错误。其使用的是语义分析技术,通过对源代码分析并生成中间语言,产生代码的数据流图和控制流图,对程序所有的可执行路径中所有变量取值进行近似,采用近似后的取值超集,验证代码的执行路径是否会引起运行时错误,从而能达到代码测试路径的100%覆盖,并检查出软件中的运行时错误[7]。该软件分析的是预处理后代码,本文通过调用C 编译器使用同样的编译选项对源代码编译产生预处理代码,将预处理后的代码添加到Astree 工程中。Astree 对代码进行分析时,需要进行参数设置,点击Analysis entry 设置分析入口函数。分析的入口函数,可以为主函数,也可以为其他中断函数或者任意子函数。一旦设定后,Astree 会以这个函数为入口,分析所有可达的代码部分的运行时错误。本文对机载软件中的Main 函数进行分析,完成配置后,点击开始图标,进行代码测试分析。
软件分析测试结束后,可在多个窗口中查看多种分析结果。工程统计信息窗口显示了工程的错误数,警告数以及覆盖率。红绿灯熄灭时代表工程还没有进行分析,或者分析仍在进行但是目前为止还没有发现任何错误或报警。分析结束后,软件的测试结果通过红黄绿灯显示。
图1 入口函数设置
(a)红灯:表示存在错误A 类型报警,A 类错误是由未定义行为引起的错误、越界、被0 整除、浮点表达式等(引起不可预知的结果)。如果发生A 类错误,分析程序将停止对上下文的操作,因为没有可行的延续;
(b)黄灯:表示有B/C 类型报警,其中B 类错误代表存在数据竞争,包括读写数据竞争和写写数据竞争,这类警告不会停止对告警发生上下文的分析。C 类错误代表溢出类错误、整型溢出、无效移位等(运行时错误导致不明确的,但是可预计的行为);
(c)绿灯:分析结束后,没有发现任何错误和报警。
本文代码分析结果为红灯如图2 所示,结果表明Main函数代码中存在运行时错误。
图2 工程统计信息窗口初始结果
Findings/C 窗口按类型分组显示警告信息,本文函数测试分析后的Findings/C 窗口结果如图3 所示。
图3 Findings/C 窗口初始结果
通过Findings/C 窗口可以看到函数中存在数组越界的告警,通过查看报错代码,发现了数组使用超出定义的8 处错误。在软件开发的过程中,这种问题较为常见,而通过人工审查又很难发现问题。本文通过Astree 对代码进行分析,几秒钟的时间就可以发现越界问题,避免了代码跑飞问题的出现。在预处理后的文件中可直接修改数组越界的错误,重新分析代码后,发现越界告警消失,如图4 所示。
图4 更改代码后Findings/C 窗口的结果
将数组越界问题更改后,可以看到告警灯也由红色变成了黄色。
图5 更改代码后工程统计信息窗口的结果
查看Reachability 窗口,可以看到分析的函数代码覆盖率为67%,分析的函数中有31 行代码未覆盖。因此这31 行代码不能确定是否存在运行时错误,需要查看代码,更改不可达分支部分,提高覆盖率至100%,对全部代码进行测试分析。
图6 代码初始覆盖率
表1 代码初始覆盖率信息
查看Not Reached 窗口找到不可达分支如图7 所示,修改不可达部分的代码。Astree 代码分析时按照初始值进行逻辑判断,需要对变量运算后的结果进行判断的,可通过“__ASTREE_modify((V1,…,Vn; effect))”修 改 变 量 值的范围,完成代码修改后进行测试分析,代码覆盖率已达100%,这时可分析整个函数的代码,结果如图8、9 所示。分析结果显示,红色告警已消除,此时代码已不存在不可预知的错误。
图7 函数中不可达分支
图8 函数代码最终覆盖率
图9 Findings/C 窗口最终结果
1.2 Astree 软件测试分析
本文通过使用Astree 对软件进行测试分析,发现该软件能够更快并且更精确地发现代码问题,可避免误报导致大量的人工分析。Astree 为嵌入式系统提供先进的测试工具,能够尽早发现机载软件中的运行时错误,为软件开发提供技术支持,可保障软件开发的质量和效率,节省测试阶段的时间和人力成本。通过Astree 测试应用,发现其具备以下特点:
(a)在编译阶段就能检测出软件的运行时错误,将代码放在Astree 测试环境下,经过简单配置后,便可自动测试代码是否存在运行时错误;
(b)测试时无需编写测试用例,传统的覆盖率测试需要花费大量时间精力开发测试用例,而使用Astree 可自动生成用例,不需要人工编写;
(c)测试时无须设置代码插装,也不必改变开发过程;
(d)分析准确性高,可实现“零误报”;
(e)分析速度快,几秒钟可完成一个函数测试。
本文首先介绍了软件测试技术,并提出了目前机载软件测试存在的困难。本文使用Astree 对代码进行分析和测试,发现了代码中的越界问题,并可分析代码的覆盖率。发现了代码中存在不可达分支,通过更改错误代码,将覆盖率提高至100%,重新对代码进行测试分析,代码不存在不可预知的错误,降低了软件的风险。该测试方法为软件开发阶段提供了技术支持,使开发人员尽早发现代码中的问题,从而提高代码的质量和可靠性。本文研究了软件运行时错误的测试方法,机载软件测试过程中还存在其他问题,测试工具的使用和测试方法仍需继续研究。
猜你喜欢越界软件测试覆盖率民政部等16部门:到2025年村级综合服务设施覆盖率超80%今日农业(2022年15期)2022-09-20越界·互换·融合——中国化爵士乐的生成路线与认同政治文学与文化(2022年4期)2022-03-23我国全面实施种业振兴行动 农作物良种覆盖率超过96%今日农业(2021年21期)2021-11-26基于OBE的软件测试课程教学改革探索计算机教育(2020年5期)2020-07-24EXCEL和VBA实现软件测试记录管理电子制作(2018年16期)2018-09-26关于软件测试技术应用与发展趋势研究电子测试(2017年15期)2017-12-18软件测试工程化模型及应用研究中央民族大学学报(自然科学版)(2016年1期)2016-06-27阵列方向图综合中PSO算法粒子越界处理研究现代防御技术(2016年1期)2016-06-01基于喷丸随机模型的表面覆盖率计算方法西南交通大学学报(2016年6期)2016-05-042015年湖南省活立木蓄积量、森林覆盖率排名前10位的县市区林业与生态(2016年2期)2016-02-27