基于嵌入式软件代码审查的研究

时间:2022-07-15 12:28:02

基于嵌入式软件代码审查的研究

摘 要:代码审查是发现软件缺陷、提高软件质量和可靠性的有效手段。本文研究总结了嵌入式软件代码审查中需要着重检查的项目内容,与常用软件错误检查相结合,可以有效地发现嵌入式软件代码中存在的缺陷,显著提升软件测试的效果。

关键词:代码审查;嵌入式软件;检查单

0 引言

随着嵌入式系统软件功能的日益强大,其规模和复杂性也日益增加,进行专业化的高效的软件测试的要求越来越迫切,挑战性也越来越强。软件测试的目标就是要尽可能早一些找出缺陷,并且确保缺陷得以修复从而保证软件的质量。

软件测试按照是否执行软件代码分为动态测试和静态测试,静态测试方式又分为基于软件工具的静态分析和基于人工分析的代码审查。一般认为代码审查是一种高效的软件测试手段,可以比动态测试更有效地发现某些特定类型的缺陷,且实施时无需特别条件,成本较低。工程实践表明,代码审查是发现软件缺陷、提高软件质量和可靠性的有效手段,该阶段发现的软件缺陷数目占整个软件测试周期发现缺陷总数的40%~60%[1]。

1 代码审查概述

1.1 代码审查定义

代码审查是一种正式的评定技术。由除作者之外的某人或某一小组仔细检查软件代码,以找出故障和违反开发标准之处以及其他一些问题。软件代码审查的目的是检查代码和设计的一致性、代码执行标准的情况、代码逻辑表达的正确性、代码结构的合理性以及代码的可读性[2]。

1.2 代码审查过程

1.2.1 个人审查

在进行软件代码审查之前我们要求先完成软件静态分析,这有利于软件测试人员在后续代码审查时对软件建立宏观上认识,在审查中容易做到有的放矢,更易于发现软件代码中的缺陷。具体表现在:

1)软件静态分析是通过专业软件静态分析工具对程序结构、数据结构、代码品质等在非运行状态下的分析,它提取了软件大量的静态内部信息,比如违背编码规则、子程序模块、调用/被调用关系、扇入/扇出数等,可以为代码审查提供辅助参考信息,依据现有的度量模型定量地评价软件的内在质量[3];静态分析的查错功能是编译系统不能替代的,因此,有必要在编译通过之后及其它静态测试开始之前,进行静态分析。

2)编程准则检查是静态分析的重要组成部分,也是以往代码审查具体检查项的规范化总结。编程规则的许多条款以前是代码审查检查单中的内容,但依据人的检查工作量大且往往会遗漏,现在上升为专业工具检查,大大提高了检查的效率和准确性。软件中编程准则的违背往往是缺陷引入最可能的地方,但并不是违背住处必定是功能缺陷之处,这还需要再进行分析。代码审查就要对使用工具所做的静态分析的结果进行验证。

个人审查时测试人员要仔细阅读代码和相关材料,结合静态分析的结果对软件代码进行审查,同时还要对照代码检查单,记录下发现的问题及明显缺陷。

1.2.2 会议审查

由组长、资深程序员、程序开发人员与专职测试人员组成测试小组,在一起以会议的形式进行代码审查。审查首先由程序开发人员逐条语句讲述程序的逻想结构。在讲述的过程当中,小组的其他成员应提问题、判断是否存在错误,同时对照代码检查单进行分析讨论,对讨论的各个问题形成结论性意见。

利用代码检查单对软件进行审查是代码审查过程的一个重要部分,如果想发现和改正程序中的每一个缺陷,就必须遵照一个精确的规程。检查单可以帮助确保遵循这个规程。本文针对C语言代码的检查部分,列出检查单中常见的错误类型:

1)一致性错误:一致性错误主要是检查设计的所有功能是否都已经编码,以及所有的代码是否都可对应到设计文档。

2)数据引用错误:数据引用错误是指使用未经正确初始化用法和引用方式的变量、常量、数组、字符串或记录而导致的软件错误。

3)数据声明错误:数据声明错误是指不正确地声明或使用变量和常量。

4)运算错误:计算错误是基本的数学逻辑问题,计算无法得到预期结果。

5)比较错误:小于、大于、等于、不等于、真、假。比较和判断错误很可能是边界条件问题。

6)控制流错误:控制流程错误的原因是编程语言中循环等控制结构未按预期的方式工作。它们通常由计算或者比较错误直接或间接造成。

7)子程序参数错误:子程序参数错误的来源是软件子程序不正确地传递数据。

代码审查的目的就是为了产生合格的代码,代码审查过程中正确地使用代码检查单可以用较少的时间更好的发现程序中的缺陷,同时根据测试经验和代码审查中发现的错误也可以补充完善检查单,为后续软件测试提供有价值的参考。

2 代码审查实践

2.1 嵌入式软件特点

嵌入式软件是基于嵌入式系统设计的软件,它是由程序以及文档组成。嵌入式软件同通用软件的区别主要表现在以下几方面:首先,与通用的软件有很强的兼容性不同,嵌入式软件只能运行在特定的目标机上,与其所属的目标机系统有很强的耦合性,软件的实现细节和目标机系统的结构、I/O端口配置等都有关系;其次,由于嵌入式系统计算机应用要求,需要在规定的时间内完成处理功能,这就要求嵌入式软件要有很强的实时性;另外,嵌入式实时系统对外部事件的响应一般都是通过中断来处理的,其对中断的处理方式直接影响到系统的实时性能。但在实际应用中,由于中断的复杂性,不可能进行充分的测试,而只能通过充分的中断分析来弥补。因此,嵌入式软件的测试应有别于通用的软件。

2.2 嵌入式软件代码审查实践

在我院相关产品中,嵌入式软件占了绝大多数,而嵌入式软件又是最难测试的一类软件,表现在其实时性强、I/O通道少、开发工具昂贵、内存不丰富、与硬件紧密相关、CPU种类繁多等[4],且嵌入式软件比普通软件对可靠性的要求更高,因此有必要对嵌入式软件的测试技术做深入的研究。本人结合我院代码审查工作情况,总结了多个嵌入式产品软件的测试结果及经验,归纳出在嵌入式软件代码审查中,除常见错误类型之外还应着重检查的内容:

2.2.1 初始化检查

主要检查在系统软件工作开始时,系统的软件硬件是否都处于一个完备的、正确的初始状态。检查项目有:

1)软件在初始化时是否确保禁止、互锁和安全逻辑的配置,并保证满足异常限制条件。

2)加电初始化的系统状态是否和所有外部接口的初始状态规定相符合。

3)软件是否将可置换单元初始化,启动和置于某个已知的安全状态。

4)所有不使用的RAM、寄存器(包括可编程逻辑芯片的共享RAM,寄存器)是否初始化。

5)非正常条件下系统是否初始化。

2.2.2 接口检查

主要检查是否会因为接口处理不当导致软件功能的错误或损失,甚至硬件的损坏。检查项目有:

1)接换数据的以下特征:信源、信宿、类型、格式、协议、传输速率、分辨率、吞吐量。

2)外部系统来的复杂数据,考虑可能的失效模式。

3)数据采集的频率和外部数据的变化率是否相适应。

4)数据采集的分辨率和外部数据的精度是否相适应。

5)串行通讯的异常处理的适合性。

2.2.3 中断处理检查

主要检查是否会因为中断处理不当导致软件性能下降,死锁和数据腐败。检查项目有:

1)检查软件中用到的中断,分析它们的属性,比如是属于定时中断、周期性中断还是随机中断;是偶发的还是频繁的;是系统内部的还是系统外部的。

2)检查中断之间的关系,中断的优先级分配;中断之间是否有约束机制,如A中断必须在B中断之后出现等。

3)中断的处理流程,中断入口的保护;中断出口的恢复;中断执行时间是否合适;开中断的时机是否恰当。

4)中断的嵌套,中断控制初始化是否和硬件电路相容,是否和系统功能要求一致;可能发生的最大嵌套次数;是否有自嵌套的情况;是否会丢失低级中断;是否会发生死锁。

5)资源竞争检查,有无共享的缓冲区、变量和I/O端口存在,读、写处理有否冲突;有无同时出现的中断申请。

6)异常情况的处理,是否采用了防止干扰引起中断误触发的措施,发生误触发或丢失中断对系统功能有什么影响。

7)对中断信号的确认处理和硬件电路是否一致。

2.2.4 与时间特性有关的检查

主要检查是否会因为处理不当导致软件功能的时间特性下降错误或功能紊乱。检查项目有:

1)在超过正常响应时间时,是否有适合的保护机制。

2)对与时间相关的功能,例如滤波、积分、延迟、迭代等,是否有算法超时保护机制。

3)采样周期是否考虑了干扰信号的频率。

4)不使用空操作或空循环来做延时。

5)不使用大的多重if-then-else 和多重case结构。

2.2.5 安全性可靠性的处理检查

检查为提高系统安全性和可靠性的处理措施是否合适。检查项目有:

1)检查出现硬件失效,导致系统失效的软件故障的情况下,或者软件检测到一个与当前运行模式不一致的配置时,软件是否有能力将系统置于某个安全状态。

2)采取的检错、防错、纠错和容错措施是否有效,并且没有副作用。

3)对关键功能的所有不期望事件,是否都有处理要求且措施合适。

2.2.6 重用代码检查

在有延续性的产品中,代码或组件重用是很常见的现象,当代码或组件的重用方式与原来的设计者或开发者的意图不同时,重用可能就是不恰当的。重用检查项目有:

1)检用代码是否有依赖性,如果代码要依赖其它完成特定任务的东西,而新的程序不完成那个任务,代码就不能正常工作。

2)检用代码与新程序的集成,如果新的程序中定义的变量、给定的常量或指针,不是被重用的模块所期望的,也会造成代码的重用错误。

实践证明,以上这些检查内容可以有效地发现代码中存在的缺陷,是常用测试内容的有益补充,能显著地提升软件测试的效果。

3 结论

本文介绍了软件代码检查单中的常见错误类型,列举了嵌入式软件因为其特殊性而应着重检查的内容,两者结合对嵌入式软件进行代码审查,可在有限的软件测试周期内对程序的正确性、规范性、一致性、中断处理、时间特性、安全性可靠性等方面进行有效的检查。通过使用该方法在实际工程项目中发现了众多的软件缺陷,效果显著,从而提高了整个测试工作的效率。

参考文献:

[1] Oliver Laitenberger. Studying the Effects of Code Inspection and Structural Testing on Software Quality[J].

[2] 许聚常,朱国庆,尹平等.GJB/Z141军用软件测试指南.中国人民总装备部.2004.

[3] 尹平,许聚常,张慧颖.软件测试与软件质量评价.北京:国防工业出版社.2008.

[4] 吴康,雷航.面向多语言混合编程的嵌入式测试软件设计与实现.成都:电子科技大学.2007.

上一篇:车险人伤理赔中的“囚徒困境” 下一篇:基于VAR模型的上海房价与租金关系再检验