Klocwork在嵌入式软件静态测试中的应用

本文作者:admin       点击: 2011-07-15 00:00
前言:
一、引言

随着数字信息技术和网络技术的高速发展,嵌入式系统以其内核小、专用性强、系统精简、高实时性等特点,正越来越多的渗透到我们工作和生活的方方面面。根据IEEE(国际电气和电子工程师协会)的定义,嵌入式系统是“用于控制、监视或辅助操作机器和设备的装置”[1]。由定义可见,嵌入式系统的专用性很强,通常是面向用户、产品和特定应用的。嵌入式软件作为嵌入式系统的重要组成部分,也是和硬件及特定应用强相关的。为提高系统精简程度,嵌入式软件通常没有系统软件和应用软件的明显区分。嵌入式软件对实时性的要求极高,且常常工作于要求长期无差错运行、无人值守的状态,因此嵌入式系统对于嵌入式软件的质量要求极高,这就对嵌入式软件的编写和测试提出了极高的要求。

在嵌入式软件的生命周期中,测试是必不可少、及其重要的一个环节。通过软件测试,才能充分的排除和修正嵌入式软件设计过程中的不合理、不可靠的因素,在软件大规模投入使用之前,减小其出错的可能性,延长嵌入式软件的生命周期。嵌入式软件测试是建立在一般软件测试的基础之上的。从是否执行程序代码的角度分类,可以分为静态测试和动态测试两种测试方法。

静态测试方法是指不运行被测程序代码,仅通过分析或检查源语句的语法、结构、过程、接口等来检查程序的正确性。静态测试方法通过对于程序静态特性的分析,找到欠缺和可疑之处。通过静态测试,可以有效提高软件的质量和可靠性,并为动态测试进一步的查错以及测试用例的选取提供指导。

本文将简要介绍嵌入式软件静态测试的主要内容,并结合实际测试案例,介绍软件测试工具在Klocwork在嵌入式软件静态测试中的应用,为嵌入式软件的静态测试提供参考。
  
二、嵌入式软件静态测试内容

对嵌入式软件进行静态测试涉及到多方面的技术和内容,主要包括:嵌入式软件编程规范检查、嵌入式软件质量度量、嵌入式软件错误检测以及基于源代码的静态测试。下面分别进行简要介绍。

1. 嵌入式软件编程规范检查
在嵌入式系统软件开发领域,C语言以其灵活性、易上手、效率高等特点,成为嵌入式软件开发的主流开发语言。但由于C语言是一种弱类型的语言,用C语言编写的程序可靠性很难保证。在C语言标准中,未定义行为(undefined behavior)、未指明行为(unspecified behavior)、实现定义行为(implementation-defined behavior)等一些不安全的用法是普遍存在的。

良好的编程规范及编写格式能在很大程度上规避C语言的安全隐患,在对可靠性要求极高的嵌入式软件开发过程中更要求程序编写者遵从良好的编程规范。目前嵌入式系统中的C语言标准是MISRA C。MISRA(The Motor Industry Software Reliability Association)是一个汽车工业的软件与可靠性协会,为了提高嵌入式软件的可靠性,该协会提出C语言编程规范并经过了长期的修订。MISRA C 2004规范将141条规则分为21个类别,每个规则对应一条编程准则[2]。另外GJB5359-2005《航天型号软件C语言安全子集》作为我国的军用标准,也是一个优秀的C语言编程规范。

嵌入式软件编程规范检查就是要检查嵌入式软件代码是否严格遵守了上述编程规范。检查的方式可以是人工走查,也可以利用测试工具。

2. 嵌入式软件质量度量
软件质量是一个复杂的概念,从不同的角度出发,会有不同的理解。从用户的角度看,质量就是满足用户的需求;从开发者的角度看,质量就是与需求说明保持一致;从产品的角度看,质量就是产品的内在特点。
嵌入式软件质量,是指与嵌入式软件满足规定的和隐含需求能力有关的全体特征或特性。

对于嵌入式软件的质量进行全面评价是保证其质量的关键步骤。量化的评价嵌入式软件的质量可以通过建立适当的质量模型来实现。目前国内软件质量的国家强制质量标准是GB/T 16260-2006《软件工程产品质量》。它依据ISO/IED 9126,以McCall质量模型为基础,从外部质量、内部质量和使用质量三个层面全面刻画的软件质量[3]。但由于嵌入式软件与实际硬件及应用强相关的特点,在依照这些标准或者采用标准中的质量模型对嵌入式软件的质量进行度量的时候,还是存在着许多不适应的情况,这给嵌入式软件的质量度量工作造成了一定的麻烦和障碍,需要软件测试人员根据实际情况对这些标准或者模型进行修改或者调整。

3.嵌入式软件错误检测
嵌入式软件错误检测使用算法技术检查源代码中的错误,并标明问题区域,以便编程人员做更详细的检查。编译器只能识别出语法规则上的错误,而错误检测需要检测的错误内容要广的多,主要包括:
● 变量是否定义
● 模块接口一致性
● 错误的逻辑结构
● 不可达的程序段
● 变量错误的影响范围分析
● 约束检查(空指针、越界指针、超界数组等的检查)
● 非法类型转换
● 多线程中未保护数据的访问冲突

在传统意义上,错误分析是动态测试的范围。但错误发现的越晚,修正的成本就越高。因此,在静态测试发现并修正错误,还是有很大的必要性。

4.基于源代码的静态测试
静态测试是指不用执行源代码的测试,它基于源代码,采取代码走查、技术评审、代码审查的方法对软件产品进行测试。

从概念上讲,基于源代码的静态测试主要包括桌面检查(Desk Checking)、代码审查(Code Reading Review)、代码走查(Walk Through)和技术评审(Review)4种方式,分别简介如下:
● 桌面检查:程序员自己检查自己编写的程序。优点是节省检查时间,缺点是主观片面性强,难以查错。
● 代码审查:由若干程序员和测试人员共同组成一个会审小组,通过阅读、讲解、讨论等方式,对程序进行静态分析。
● 代码走查:与代码审查基本相同,增加了一项内容:小组成员一起模拟计算机,让测试用例沿程序逻辑运行。
● 技术评审:由开发组、测试人员和相关人员(QA、产品经理等),采用讲解、提问等进行查找错误的活动。

在实际工作中,应根据项目的实际情况来决定采取哪种静态测试形式,不用严格区分到底是哪种方法。

嵌入式软件的错误检测类型繁多、数量巨大,单单靠测试人员的热情、韧劲和认真程度是很难坚持下去的,因此应运而生了许多自动测试工具,如Klocwork、Testbed、Logicscope、Purify等。下面结合实例,对广范应用于软件测试领域的Klocwork测试工具进行介绍。

三、Klocwork测试工具介绍

1.Klocwork简介
Klocwork软件是由Klocwork公司基于其专利技术——分析引擎而开发出的静态分析工具。该工具综合应用了多种先进的静态分析技术,是使用最广泛的静态分析工具之一。

Klocwork的主要优点如下[4]:
● 支持语言种类多,如C、C++、Java等
● 能全面发现软件缺陷,如软件质量缺陷、安全漏洞缺陷、软件架构/编程规则缺陷等
● 软件功能全面,可视化架构分析能力强
● 兼容多种主流IDE开发环境
● 能分析超大型软件,分析速度快

2.Klocwork应用举例
Klocwork的界面简洁易用。双击Start Klocwork Servers图标后,Klocwork所需要的4个服务将自动后台运行,并开启服务界面。双击Klocwork Management Console图标,进入控制台界面,控制台界面如图1所示:
新建一个源代码分析工程,本例中选取的源代码采用C语言编写,语言类型选择C。添加已经经过Klocwork分析器分析生成的*.out文件后,即可进入报告选项界面。报告选项界面如图2所示。报告选项中共有4个选项(一般全部勾选),其作用是定制Klocwork报告中所包含的内容。选定后,点击“Build Now”按钮,并选择源码分析结果的保存位置,即进入源码分析阶段。

源码分析阶段完成之后,即可查看分析结果。可以通过Web方式查看分析结果。Klocwork源码分析工具默认设置的端口号为8080,可在地址栏输入源码分析工具所在IP地址和端口号进行结果的访问。进入主界面后,点击“Klocwork Review”,选择已建立的工程,即可查看分析报告(Reports)、问题管理(Issue Management)等内容。在分析报告显示内容的界面上,可查看排名前十的问题等内容,如图3所示。亦可点击“Issue Management”按钮,查看代码缺陷总述,如图4所示。

在代码分析总述界面中,可详细看每个缺陷的具体类型及详细追踪信息。Klocwork工具将缺陷分为致命(critical)、严重(severe)、错误(error)、非预期(unexpected)等十个等级。其中空指针引用、缓冲区溢出、数组越界、内存泄漏等19个错误被Klocwork工具视为致命缺陷。

3.Klocwork应用评价
通过上面的介绍,Klocwork功能强大、选项众多,而且界面非常友好、十分易用。作者在多个测试项目中,利用Klocwork进行了静态测试。Klocwork针对编程缺陷、头文件问题和安全漏洞等方面的代码检查非常出色,检查出的代码多涉及空指针引用、不安全的命令参数、内存泄露等。这些问题多是可能引起程序崩溃的致命问题,但在功能测试中不易被发现或定位。因此在做功能测试之前,用Klocwork对于代码进行静态测试十分必要。

四、结束语

本文阐述了嵌入式软件测试中静态测试的主要内容,并结合实例说明了Klocwork测试工具在嵌入式软件测试中的应用。Klocwork工具功能强大、参数众多,在此无法一一列举。软件测试人员在测试过程中,需要根据被测工程的实际情况,选定使用功能、配置工具参数,使Klocwork更好的发挥作用。

参考文献
[1]  蔡建平. 嵌入式软件测试实用技术[M].北京: 清华大学出版社, 2010.
[2]  A Brief History of MISRA C: http://www.misra-c.com/Activities/MISRAC/tabid/160/Default.aspx.
[3]  GJB 5236-2004 军用软件质量度量.
[4]  尹浩 于秀山. 程序设计缺陷分析与实践[M].北京: 电子工业出版社, 2011.