论文部分内容阅读
【摘要】提出了一种对编译器产生的目标代码覆盖率的分析方法。传统的结构化语言的覆盖技术使用的是源代码级的,无法对编译器产生的代码进行验证,本文介绍了VerOCode软件在PPC目标环境中目标码覆盖率的分析验证。
【关键词】DO-178B;目标码覆盖;VerOCode
1.引言
目标码覆盖率分析技术是嵌入式软件系统质量保障的重要技术手段,目前在安全领域认可与使用的目标码验证要求来自于美国航空无线电技术委员会(RTCA)和欧洲民用航空设备组织(EUROCAE),为美国联邦航空管理局(FAA)以及欧洲航空管理部门的机载软件适航认证而制定的DO-178B/ED-12B标准。DO-178B/ED-12B标准将软件安全等级分为A-E级,在DO-178B 6.4.4.2中要求:“覆盖率分析可以在源代码上开展,对于A级软件并且编译器产生的目标代码不能直接追踪到源代码的语句,那么需要对目标码进行额外的验证工作以确保产生的代码序列是正确的。”
这里提到的“基于目标码的额外验证工作”可以由目标码覆盖率分析来实现,即:编译器在编译过程中在目标码中添加了额外的代码,可以通过目标码覆盖率分析发现这部分代码,并且可以建立源代码与目标代码之间的关系。而源代码覆盖率方法由于进行了代码插装,测试的对象已经改变了,无法对编译器多添加的代码进行验证。在国外的适航认证经验中,目标码覆盖率分析已经得到广泛的使用,并且被适航认证局所认可。
2.目标码覆盖
2.1 目标码覆盖的出处
目标码覆盖的概念和要求在RTCA/DO-178B标准中明确提出,相关内容如下:结构覆盖分析的目的是确定在基于需求的测试过程中,哪些代码结构没有被执行。基于需求的测试用例可能没有完全执行所有的代码结构,因此需要进行结构覆盖分析,并要求进行覆盖分析验证。
结构化语言的覆盖分析可以在源代码级别进行。但是如果是DO-178B A级软件并且编译器产生的目标代码不能直接追踪到源代码中的语句,那么验证工作就需要采取额外地分析方法,即在目标代码的级别上验证编译器产生的代码序列的正确性。在目标代码中的数组边界检查就是编译成生成(compiler-generated)的不能直接追踪到源代码的目标代码的一个实例。
2.2 进行目标码验证的原因
(1)测试充分性要求
目标码的验证关心编译器产生的目标码的控制流结构有多少与源代码不一致。这些不一致产生的原因有许多,如:编译器的解释、优化等。然而,传统的结构化语言的覆盖率技术使用的是源码级的,尽管在处理器上执行的是目标码,二者之间控制流结构的不同在测试过程中会产生重大的差距。
MISRA C:2004认为C程序设计中存在的风险可能由5个方面造成:程序员的失误、程序员对语言的误解、程序员对编译器的误解、编译器的错误和运行时错误(runtime errors)。
(2)程序员对编程语言和编译器的误解
编译器的行为不符合程序员的想法。很多高级语言标准特别是工业级语言标准的定义并不精确。如果一个语言的某些特征是不完全定义的,或者说是歧义的,那么就可能出现程序员的意思与编译器的解释不一致的情况。所以对于不同的编译器,相同的源代码其行为可能不同;同一个编译器,其行为也可能因为上下文的不同而不同。例如C语言中的volatile的类型就是一个例子。
(3)编译器的错误
语言的编译器本身是一个软件工具,它编译代码并不总是正确的。例如可能在某些情况下它没有遵守语言标准,或者它本身就有错误。随着编译器验证技术的不断发展,越来越多的编译器问题被暴露出来。
针对嵌入式软件,由于运行资源有限,有时编译器产成的代码本身并没有问题,但仍然会导致系统失效。
3.关于编译器验证
对于高级语言程序,编译器经常会引入风险。对编译器进行验证是保证其正确产生目标码的最直接的方法。然而,目前对编译器的完全验证还存在非常困难的技术问题。编译器是一种特殊的系统软件,编译器的输入和输出都是应用软件或系统软件。由于编译器的这个特殊性和编译器本身结构的复杂性,使编译器的测试验证面临着巨大的挑战。目前,关于编译器的验证问题已经有广泛的研究,例如编译器使用的主要算术逻辑的验证、算术表达式的验证、编译器结构的验证等。但这些编译器的验证方法都比较复杂,实用性和灵活性也不强。此外,编译器验证软件的价格昂贵,编译器验证的效果难以估计,一般的软件开发单位也不会出资进行编译器验证。在不能完全信赖编译器的情况下,进行目标码验证是唯一的选择。
4.解决途径
目前,为了满足市场上不断涌现的目标码验证需求,有几个著名的外国厂商推出了相关的支持方案和工具,比如英国LDRA公司的Tbrun工具、美国IBM公司的TestRT工具和和美国VeroCel公司的VeroCode工具等,本文重点介绍VeroCode工具。VerOCode是目标码覆盖率分析工具,VeroCode不需要特殊硬件,被测试的代码也不需要插装。应用代码在目标计算机(例如:PowerPC)上执行,执行的数据图表收集到一个宿主机上(PC)。VerOCode使用收集的执行数据图表与链接器符号信息和编译器产生的清单一起,可以显示出哪些指令执行了,哪些指令没有执行,以及条件指令执行过程中的分支条件代码状态。产生的VerOCode结果清单包含了DO-178B A级,适航认证最高级别的安全性要求所要求的目标码覆盖覆盖率分析的证明。
VerOCode已成功实施到国内某研究所的实际项目之中,针对PPC裸板应用和使用DeltaOS的PPC板应用,VerOcode实现了目标码级的覆盖率分析。
VerOCode记录和显示被测试程序中执行的目标码指令。对于条件指令,VerOCode显示每次指令执行时的条件代码的状态。VerOCode工作在Host-Target模式,其工作流程图如图1所示。 监控和测试程序(测试控制和被测单元)在PPC目标机上执行,覆盖率在机器码级获得。由于目标系统提供printk函数,可在串口打印数据输出,通过超级终端或其他串口监控程序可获得数据结果。一个测试运行以后,收集的覆盖率数据通过串口上传到宿主机来分析。测试数据格式以字母H作为开头行,D行和Z行交替出现作为数据行,T行做为结束行。
VeroMon.o监控程序要求必须运行在系统态(supervisor-level),它要调用mfmsr等特权指令读取寄存器状态。同时被测试系统的剩余内存分配必须满足VeroMon.o的内存要求:
.text–Monitor’s code(approx.5KB);
.data–initialized data(approx.1KB);
.bss–coverage data table(256 KB,global symbol coverageDataTable).
对于PPC裸板应用,VeroCode提供的Monitor代码不需要做任何定制即可实现目标码覆盖的验证,并通过目标板下载程序运行,得到详细的目标码覆盖率报告。
对于使用国产DeltaOS操作系统的PPC板,由于RTOS控制了目标板的所有硬件资源,通过分析其RTOS的硬件Vector列表,重新对Monitor进行定制,实现VerOcode代码与DeltaOS代码的兼容,从而实现了嵌入式操作系统“道DeltaOS”的支持。
5.结束语
不依赖于源代码以及编译器的目标码覆盖率分析,是实现符合DO-178B/ED-12B标准规定的目标码分析与验证的难点之一,本文通过在PPC裸板应用和使用DeltaOS的PPC板应用,VerOcode实现了目标码级的覆盖率分析。
参考文献
[1]DO-178B,DO-178B software considerations in airborne systems and equipment certification[S].
[2]Verocel inc.VerOCode-software coverage tool[OL].http://www.verocel.com.
[3]文勇,蔡铭,陈刚,杨子江,金星.目标码流图和结构覆盖率获取方法[J].计算机工程与设计,2010,31(11).
作者简介:叶祥明(1978—),江西瑞昌人,大学本科,工程师,现供职于中国船舶重工集团公司第七一○研究所,研究方向:软件测试、软件工程。
【关键词】DO-178B;目标码覆盖;VerOCode
1.引言
目标码覆盖率分析技术是嵌入式软件系统质量保障的重要技术手段,目前在安全领域认可与使用的目标码验证要求来自于美国航空无线电技术委员会(RTCA)和欧洲民用航空设备组织(EUROCAE),为美国联邦航空管理局(FAA)以及欧洲航空管理部门的机载软件适航认证而制定的DO-178B/ED-12B标准。DO-178B/ED-12B标准将软件安全等级分为A-E级,在DO-178B 6.4.4.2中要求:“覆盖率分析可以在源代码上开展,对于A级软件并且编译器产生的目标代码不能直接追踪到源代码的语句,那么需要对目标码进行额外的验证工作以确保产生的代码序列是正确的。”
这里提到的“基于目标码的额外验证工作”可以由目标码覆盖率分析来实现,即:编译器在编译过程中在目标码中添加了额外的代码,可以通过目标码覆盖率分析发现这部分代码,并且可以建立源代码与目标代码之间的关系。而源代码覆盖率方法由于进行了代码插装,测试的对象已经改变了,无法对编译器多添加的代码进行验证。在国外的适航认证经验中,目标码覆盖率分析已经得到广泛的使用,并且被适航认证局所认可。
2.目标码覆盖
2.1 目标码覆盖的出处
目标码覆盖的概念和要求在RTCA/DO-178B标准中明确提出,相关内容如下:结构覆盖分析的目的是确定在基于需求的测试过程中,哪些代码结构没有被执行。基于需求的测试用例可能没有完全执行所有的代码结构,因此需要进行结构覆盖分析,并要求进行覆盖分析验证。
结构化语言的覆盖分析可以在源代码级别进行。但是如果是DO-178B A级软件并且编译器产生的目标代码不能直接追踪到源代码中的语句,那么验证工作就需要采取额外地分析方法,即在目标代码的级别上验证编译器产生的代码序列的正确性。在目标代码中的数组边界检查就是编译成生成(compiler-generated)的不能直接追踪到源代码的目标代码的一个实例。
2.2 进行目标码验证的原因
(1)测试充分性要求
目标码的验证关心编译器产生的目标码的控制流结构有多少与源代码不一致。这些不一致产生的原因有许多,如:编译器的解释、优化等。然而,传统的结构化语言的覆盖率技术使用的是源码级的,尽管在处理器上执行的是目标码,二者之间控制流结构的不同在测试过程中会产生重大的差距。
MISRA C:2004认为C程序设计中存在的风险可能由5个方面造成:程序员的失误、程序员对语言的误解、程序员对编译器的误解、编译器的错误和运行时错误(runtime errors)。
(2)程序员对编程语言和编译器的误解
编译器的行为不符合程序员的想法。很多高级语言标准特别是工业级语言标准的定义并不精确。如果一个语言的某些特征是不完全定义的,或者说是歧义的,那么就可能出现程序员的意思与编译器的解释不一致的情况。所以对于不同的编译器,相同的源代码其行为可能不同;同一个编译器,其行为也可能因为上下文的不同而不同。例如C语言中的volatile的类型就是一个例子。
(3)编译器的错误
语言的编译器本身是一个软件工具,它编译代码并不总是正确的。例如可能在某些情况下它没有遵守语言标准,或者它本身就有错误。随着编译器验证技术的不断发展,越来越多的编译器问题被暴露出来。
针对嵌入式软件,由于运行资源有限,有时编译器产成的代码本身并没有问题,但仍然会导致系统失效。
3.关于编译器验证
对于高级语言程序,编译器经常会引入风险。对编译器进行验证是保证其正确产生目标码的最直接的方法。然而,目前对编译器的完全验证还存在非常困难的技术问题。编译器是一种特殊的系统软件,编译器的输入和输出都是应用软件或系统软件。由于编译器的这个特殊性和编译器本身结构的复杂性,使编译器的测试验证面临着巨大的挑战。目前,关于编译器的验证问题已经有广泛的研究,例如编译器使用的主要算术逻辑的验证、算术表达式的验证、编译器结构的验证等。但这些编译器的验证方法都比较复杂,实用性和灵活性也不强。此外,编译器验证软件的价格昂贵,编译器验证的效果难以估计,一般的软件开发单位也不会出资进行编译器验证。在不能完全信赖编译器的情况下,进行目标码验证是唯一的选择。
4.解决途径
目前,为了满足市场上不断涌现的目标码验证需求,有几个著名的外国厂商推出了相关的支持方案和工具,比如英国LDRA公司的Tbrun工具、美国IBM公司的TestRT工具和和美国VeroCel公司的VeroCode工具等,本文重点介绍VeroCode工具。VerOCode是目标码覆盖率分析工具,VeroCode不需要特殊硬件,被测试的代码也不需要插装。应用代码在目标计算机(例如:PowerPC)上执行,执行的数据图表收集到一个宿主机上(PC)。VerOCode使用收集的执行数据图表与链接器符号信息和编译器产生的清单一起,可以显示出哪些指令执行了,哪些指令没有执行,以及条件指令执行过程中的分支条件代码状态。产生的VerOCode结果清单包含了DO-178B A级,适航认证最高级别的安全性要求所要求的目标码覆盖覆盖率分析的证明。
VerOCode已成功实施到国内某研究所的实际项目之中,针对PPC裸板应用和使用DeltaOS的PPC板应用,VerOcode实现了目标码级的覆盖率分析。
VerOCode记录和显示被测试程序中执行的目标码指令。对于条件指令,VerOCode显示每次指令执行时的条件代码的状态。VerOCode工作在Host-Target模式,其工作流程图如图1所示。 监控和测试程序(测试控制和被测单元)在PPC目标机上执行,覆盖率在机器码级获得。由于目标系统提供printk函数,可在串口打印数据输出,通过超级终端或其他串口监控程序可获得数据结果。一个测试运行以后,收集的覆盖率数据通过串口上传到宿主机来分析。测试数据格式以字母H作为开头行,D行和Z行交替出现作为数据行,T行做为结束行。
VeroMon.o监控程序要求必须运行在系统态(supervisor-level),它要调用mfmsr等特权指令读取寄存器状态。同时被测试系统的剩余内存分配必须满足VeroMon.o的内存要求:
.text–Monitor’s code(approx.5KB);
.data–initialized data(approx.1KB);
.bss–coverage data table(256 KB,global symbol coverageDataTable).
对于PPC裸板应用,VeroCode提供的Monitor代码不需要做任何定制即可实现目标码覆盖的验证,并通过目标板下载程序运行,得到详细的目标码覆盖率报告。
对于使用国产DeltaOS操作系统的PPC板,由于RTOS控制了目标板的所有硬件资源,通过分析其RTOS的硬件Vector列表,重新对Monitor进行定制,实现VerOcode代码与DeltaOS代码的兼容,从而实现了嵌入式操作系统“道DeltaOS”的支持。
5.结束语
不依赖于源代码以及编译器的目标码覆盖率分析,是实现符合DO-178B/ED-12B标准规定的目标码分析与验证的难点之一,本文通过在PPC裸板应用和使用DeltaOS的PPC板应用,VerOcode实现了目标码级的覆盖率分析。
参考文献
[1]DO-178B,DO-178B software considerations in airborne systems and equipment certification[S].
[2]Verocel inc.VerOCode-software coverage tool[OL].http://www.verocel.com.
[3]文勇,蔡铭,陈刚,杨子江,金星.目标码流图和结构覆盖率获取方法[J].计算机工程与设计,2010,31(11).
作者简介:叶祥明(1978—),江西瑞昌人,大学本科,工程师,现供职于中国船舶重工集团公司第七一○研究所,研究方向:软件测试、软件工程。