APP下载

嵌入式软件目标码测试分析

2009-06-20王永孟马利东

科技经济市场 2009年4期
关键词:测试工具编译器源代码

王永孟 马利东

摘要:为了更好的保证软件产品的质量,本文介绍了目标码测试的必要性,测试工具的原理及运用的约束条件。目标码测试需要工具的支持及对实现方法的摸索。

关键词:目标码;语句分支覆盖

引言

航天型号软件的高可靠性、高安全性要求,促使软件在各开发阶段都需要经过完整的测试,如:单元测试、组装测试、配置项测试、系统测试等。随着航天飞行器的发展,航天产品功能越来越多强大,其软件设计越来越复杂,越来越多的软件采用C语言或高级语言编制。随着C语言和其他高级语言编制的软件越来越多,源代码与目标代码差异可能产生的问题的几率就越来越大。编译器不同、编译选项的不同都会产生的不同目标代码。人们开始遇到对目标代码分析不彻底而出现的质量问题,对编译选项认识的不了解而产生的质量问题;越来越多的人开始担心实际运行的目标代码是否会隐藏着潜在的危害,当诱因成熟会对我们的产品带来灾难的后果。所以目标码语句和分支的覆盖率测试被提上了日程。目标码测试可以理解为真实运行在CPU上的二进制代码所对应的汇编代码的执行情况。

1目标码测试的必要性

首先举个简单的例子。C语言a [i] = i是一条非常简单的赋值语句,在Keil C51的编译环境下,对编译选项开关“don't use absolute register accesses”进行了简单的对比,产生的汇编指令如下表1所示。

通过上表可以看出,要想完全实现所有高级语言源代码和目标码的一一对应是件困难的事情,并且编译选项给目标代码带来的变化也是非常明显。

软件测试通过对语句和分支的覆盖率指标从一个方面来评估软件测试的充分性,下面再举一个Keil C51例子说明源代码和目标码测试时语句和分支覆盖率统计的差异。

在进行测试时C语言的语句有2条,而汇编会有17条;分支C语言也是2条,而汇编语言就是由4条,JZ和JC语句分别有2个分支。在进行源代码测试时只需要2个测试用例即可完成测试,而目标码测试则需要3个测试用例来完全覆盖分支的各种情况。上面这个例子可看出目标码测试要比源代码测试的难度更大一些。

从这两个例子可以看出,源代码通过编译器之后带来的变化,虽然不能得出不进行目标码测试,软件的质量就有问题或是对任务存在影响。但作为测试充分性的考量指标,源代码和目标码的覆盖率指标所反映的内容还是存在一定的差距。对于高级语言编写的可重用模块,如果编译器不同,模块重用就存在了一定的风险。

2如何实现目标码测试

任何代码的覆盖率测试都离不开工具的支持,除非微小型的软件,花费大量的人力完成统计。目前所了解到的测试工具能够支持目标码测试的也是非常有限,其工作原理如下:测试工具通过对数据线和地址线上进行采集,存储;之后对数据进行分析,得出软件运行的情况。总线上的数据都是二进制的机器代码,而每条汇编语句也对应着一个二进制机器代码。如51汇编语言“MOV A,0x09”对应的目标代码就为“E5 09”;如果数据总线上存在“E5 09”则认为CPU执行了这样一条语句。

测试工具原理图如图1所示。其中,采集头与被测环境根据实际情况进行连接,采集设备主系统负责存储和分析。采集设备与被测软件之间没有交互信息,不影响软件的运行情况。

根据上述原理完成目标码覆盖率测试会有很多制约因素,比如:

◇CPU是否存在Catch;如果存在CPU就有预取功能,那么如何判别总线上出现的指令是否执行就成了关键问题;需要一套完成的算法来识别出代码执行情况;

◇采集设备的运行速度与CPU运行速度;采集设备的速度一定是被采设备的倍数;现在CPU运行的速度越来越快,高速采集设备在抗干扰等方面要求很高;采集设备需要被测件提供可连接的接口;

◇被测软件是否运行在内部存储区;如果在内部存储区就无法获取被测软件的运行情况;

◇对应不同的汇编语言,测试工具要对应不同的分析软件或分析软件所调用的信息库不同。

通过上述方法实现目标码测试只是目前的一种,是否还有更好的方法还有待研究。因为源代码语句和分支覆盖率的统计都是通过插桩的方法实现,目标码是否也可以运用类似的方法来实现?或是有更好的方法。

3目标码测试的好处

没有提出目标码测试的概念之前,软件测试充分性一般通过源代码的语句和分支覆盖情况进行考量,更严格的还有条件覆盖,条件组合覆盖,路径覆盖等,对于后三种情况只是理论的考量方法实际工作中是很难完成的。为了进一步提高语句和分支覆盖,验证编译器没有对代码带来未知的影响,所以通过目标码语句和分支的覆盖率测试来确保测试的充分性。

某型号软件就发生过由于对目标码没有进行彻底分析而造成质量问题的案例,也发生过对编译器选项配置不一致而造成质量问题的情况。随着问题的被发现,对测试的要求越来越高。在不断的积累和探索中,必将会发现更好的方法,使开发和测试人员完全清晰掌握运行在CPU上目标码的任何细节。

4结束语

目标码测试为提高软件质量,使软件设计师和测试人员更充分掌握运行代码的确切情况是非常有帮助的。但无论是源代码还是目标码的覆盖率测试对工具的依赖是非常大的,没有好的工具支撑是无法完成这项工作的。

参考文献:

[1][美]Bart Broekman,Edwin Notenboom.嵌入式软件测试.北京:电子工业出版社.

[2][美]Parl C.Jorgensen.软件测试(原书第二版).北京:机械工业出版社.

猜你喜欢

测试工具编译器源代码
人工智能下复杂软件源代码缺陷精准校正
基于TXL的源代码插桩技术研究
基于相异编译器的安全计算机平台交叉编译环境设计
Http并发连接测试工具
软件源代码非公知性司法鉴定方法探析
手车式真空断路器回路电阻测试电流线接头研究
揭秘龙湖产品“源代码”
福禄克推出先进的连接式测试工具系统
通用NC代码编译器的设计与实现
编译器无关性编码在微控制器中的优势