时间:2024-09-03
周景科
(工业和信息化部电子第五研究所,广东 广州 510610)
专业领域软件的代码审查方法研究
周景科
(工业和信息化部电子第五研究所,广东广州510610)
代码审查是发现软件的缺陷、保证软件的质量的重要手段。现今对特定专业领域的软件进行代码审查时一般采用传统的代码审查方法,但传统的代码审查方法仍存在一些问题,基于此,提出了一种专业领域软件的代码审查方法。结果表明,该方法在实际的工程应用中能够有效地发现软件的缺陷,显著地提高软件测试效率。
代码审查;专业领域;软件测试
随着嵌入式软件复杂程度的增加、规模的增大,作为一种保证软件质量的手段,软件测试越来越受人们的重视[1]。代码审查是一种高效的软件测试手段,通过代码审查能够尽早地发现软件的缺陷,找出动态测试难以发现或隔离的软件缺陷[2]。而且越早发现缺陷,越有利于降低软件测试的成本。代码审查的另一个优点是,其能够为动态测试设计和使用测试用例提供思路。
现今对特定专业领域 (例如:雷达、电子对抗和武器等)的软件进行代码审查时主要采用传统的代码审查方法。这种方法主要关注代码本身的逻辑问题,与专业领域知识相隔离,不易发现与功能逻辑相关的有价值的问题。此外,在实际工程中,由于未对特定专业领域软件的代码审查方法进行归纳总结,从而造成了同一专业领域的软件的不同的测试项目的代码审查工作之间的可借鉴性不强,效率不高。
传统的代码审查是由程序员和测试员组成的审查小组,通过阅读、讨论和分析等方式对程序进行静态的检查的过程。代码审查是一种正式的检查和评估方法,其利用一种逐步地检查源代码中有无逻辑或语法错误的方法来检查软件中的缺陷。通常,代码审查的内容包括以下几项:检查代码和设计的一致性;检查代码对标准的遵循情况和可读性;检查代码的逻辑表达的正确性;检查代码结构的合理性[3]。
传统的代码审查的一个重要手段是建立代码审查单。审查单可以保证程序遵照精确的规程进行。下面列举了一个C语言通用代码审查单所包含的检查项目。
a)检查是否存在数据引用错误。数据引用错误是指由未经正确声明和初始化的变量、常量、数组、字符串或记录导致的软件缺陷。
b)检查是否存在数据声明错误。数据声明缺陷是由不正确的声明或使用变量和常量引起的。
c)检查是否存在计算错误。计算错误是指错误的数学计算问题,例如:除数为零、运算优先级错误和运算溢出等。
d)检查是否存在比较和判断错误。应特别关注文中使用的比较和判断用语,例如:小于、大于、等于、不等于、真、假。比较和判断错误很可能是边界问题导致的。
e)检查是否存在控制流程错误。控制流错误出现的原因是编程语言中循环等控制结构未按预期的方式工作。它们通常都是由计算或者比较错误直接或间接地造成的。
f)检查是否存在子程序参数错误。子程序参数错误的来源是软件子程序不正确地传递数据。
g)检查是否存在输入/输出错误。输入/输出错误包括文件的读取、接收键盘或鼠标输入错误,以及向打印机或屏幕等输出设备写入错误。
h)检查是否存在一致性错误。主要指程序与设计文档不一致的错误。
随着电子信息行业的快速发展,软件的规模及复杂度剧增,与此同时软件的测试压力及质量风险也在倍增。但受国内软件行业整体成熟度的限制,软件研制企业在软件测试方面的投入普遍偏低,软件测试从业人员普遍存在对被测专业领域不够熟悉,技术能力一般,人员结构偏年轻,测试项目经验十分有限等问题。
使用传统的代码审查方法对特定专业领域的软件进行代码审查时,主要依据通用代码审查单逐项进行检查。这种方法主要存在以下两个问题。
a)通用代码审查单主要关注代码本身的语法和逻辑问题,与专业领域知识相隔离,因而难以发现有价值的问题。例如:针对雷达专业领域,由于其软件本身的功能具有复杂性,因此测试人员需要具备较强的雷达领域的专业知识,且熟悉雷达软件的主要功能和雷达系统的工作流程。若仅采用传统的代码审查方法建立通用的审查单,而未结合雷达的功能进行分析,则将难以发现与雷达功能逻辑相关的有价值的问题。
b)同一专业领域不同项目的代码审查工作的可借鉴性不强,代码审查效率不高。在实际的工程项目中,同一专业领域的不同项目之间通常具有类似性和相关性。而传统的代码审查方法,每次实施新项目时,都只是根据通用代码审查单进行审查,未结合专业领域的知识对功能要素进行归纳总结,造成了项目间的可借鉴性不强,代码审查效率不高。
针对传统的代码审查方法存在的问题,本文提出了一种专业领域软件的代码审查方法。即在传统的代码审查方法的基础上,将通用代码审查单与特定专业领域的知识相结合,建立一种基于特定专业领域的代码审查单。该方法的具体实施步骤如下所述。
a)针对不同语言的软件建立通用代码审查单知识库。
b)根据特定的专业领域,将软件的功能进行划分,建立专业领域代码审查要素知识库。
c)将第一步和第二步中的知识库进行融合,将第二步的专业领域要素加入到第一步建立的通用代码审查单中,形成基于专业领域的代码审查单。
以下是建立雷达数据处理专业的代码审查单的一个应用实例。
雷达是一种用于检测和定位反射物体 (例如:飞机、舰船、航天飞机、车辆、行人和自然环境)的电磁系统[4]。常见的嵌入式雷达系统由处理机、天线单元、发射单元和接收单元组成,其结构如图1所示,在下文中将天线单元、发射单元和接收单元统称为各分机。
图1 雷达系统结构图
处理机是雷达的核心部分。处理机中驻留雷达数据处理软件和信号处理软件。数据处理软件主要完成雷达系统的调度和控制,接收上位机的控制指令并向其返回雷达状态信息,控制各分机进行工作和自检并接收各分机返回的状态信息和自检结果,控制信号处理软件的工作模式和向信号处理软件发送载机姿态数据,接收信号处理软件发送的目标信息进行点迹、航迹处理等[5]。
根据雷达数据处理软件的功能需求及特点,结合工程经验,本文阐述了建立雷达数据处理软件代码审查单的方法。即:1)建立通用C语言代码审查单知识库,见第1章a)~h);2)将雷达数据处理软件的功能进行划分,建立雷达数据处理专业代码审查要素知识库,见2.1部分;3)建立雷达数据处理专业代码审查单,见2.2部分。
2.1建立雷达数据处理专业代码审查要素知识库
2.1.1初始化检查
初始化检查主要检查雷达数据处理软件开始工作时,系统的软硬件是否处于正确的初始状态。检查要点如下所述。
a)定时器初始化。雷达数据处理软件采用定时器来控制整个雷达系统的时序,故定时器初始设置尤为重要。应重点关注定时周期的设置。
b)中断初始化。重点关注中断触发方式和中断使能设置。
c)接口初始化。由于数据处理软件和各分机软件之间有通信接口,由此需要依据需求及设计文档,检查接口数据传输的波特率、奇偶校验等的设置是否正确。
d)系统默认工作参数初始化。雷达上电后若未接收到上位机发送的控制指令,一般会采用默认工作方式。此时应依据需求和设计文档,检查默认参数的设置是否正确。一般应检查雷达的工作方式、量程、方位、俯仰和辐射开关等信息等。
e)故障状态标志位。雷达数据处理软件将本机和各分机自检结果上报给上位机。结合程序上下文,分析故障情况下标志位为0还是1,检查初始故障状态标志位设置是否正确。
2.1.2中断处理检查
由于无操作系统,故雷达数据处理软件使用中断的方式进行系统控制和调度。若中断处理不当,可能导致整个系统崩溃或进入死循环。在嵌入式雷达数据处理软件中,主要有定时器中断和接口通信中断两类中断。
a)定时器中断处理。软件采用定时器控制时序,一般会采用在定时中断中设置一个全局计数变量自加进行计时,在程序主循环中根据该计数变量的值来进行分时操作。应重点检查对此全局变量赋值的语句。以下举例一个典型的问题。
在中断函数中,控制上电自检时间的计数变量为g_uBitcnt。通过在程序中查找该变量的赋值和使用处发现,程序维护自检也采用同一变量g_u-Bitcnt进行计数,而在接收上位机自检控制命令中断中又将该变量清零。经分析得出若在上电自检过程中,上位机下发维护自检命令,则上电自检的计数变量g_uBitcnt将被清零,导致上电自检无法按正常时序进行。发现问题后经修改,将上电自检计数全局变量改为g_uPowerupBitcnt,和维护自检计数变量加以区分。修改前和修改后的程序如表1所示。
b)接口通信中断。雷达数据处理软件的接口中断主要包括与上位机软件的指令通信中断、与各分机的通信中断等。应重点检查各中断的优先级设置是否合理。此外,还应考虑中断嵌套的情况。考虑在上位机进行异常操作时,例如:在执行上位机工作模式切换指令的中断服务程序时,又收到上位机的自检指令中断,此时中断优先级的设置是否合理。
表1 修改前、后的程序
2.1.3自检功能检查
自检是雷达数据处理软件的重要功能。常见的自检方式主要有上电自检、周期自检和维护自检等。雷达数据处理软件主要实现对处理机和各分机单元的自检,并将自检结果上报给上位机软件。主要检查项如下。
a)检查自检对象是否完整。依据软件需求规格说明和软件设计说明,检查自检对象是否完整。
b)检查上电自检完成后是否能进入某一特定的工作模式。
c)检查维护自检与正常工作模式之间的关系是否正确。根据用途,雷达软件一般具有多种工作模式。通过分析自检函数,检查软件是否在任意工作模式下都能够进行维护自检,以及自检完成后是否能回到原工作模式。
d)检查自检项是否被人为屏蔽。在软件开发的过程中,常会因调试原因而屏蔽某些自检项。因此,在代码审查时,应检查是否有自检项被人为注释的情况。
e)检查自检标志位的设置是否正确。依据接口控制文件或接口需求规格说明,检查自检标志位是否与接口协议一致。
2.1.4通信接口检查
通信是雷达数据处理软件的重要功能。一般分为与上位机的通信和与各分机的通信两种。主要检查以下内容。
a)底层数据传输设置是否正确。包括通信速率和奇偶校验位设置是否正确。
b)应用层通信协议是否符合接口协议。依据接口协议,检查应用层通信数据包的各字段是否与接口协议一致。
c)检查通信异常时的处理策略是否合理。检查是否有握手、通信超时重传或上报故障等通信机制。
d)检查软件对异常通信报文的处理是否合理。数据处理软件可能接收到上位机或分机发送的异常的报文,例如:报文头、报文尾和校验位错误等,检查软件是否对异常的报文进行屏蔽,使用默认值或上次收到的报文值。
2.1.5控制功能检查
控制功能是雷达数据处理软件的一个重要功能,其主要实现对信号处理软件和各分机软件的控制。主要检查以下内容。
a)检查控制对象与控制内容的一致性。例如:数据处理软件能够控制信号处理软件工作在不同的工作模式下,控制发射机软件工作在不同的辐射状态下,此外,其还能够控制接收机使用的波形码和频段号等,因此对控制功能进行检查时,应首先对这些控制对象与控制内容的一致性进行检查。检查控制命令的发送对象是否正确,例如:是否存在把发送给接收机的控制命令发送给发射机的问题。
b)检查控制命令与接口协议的一致性。依据接口协议,检查数据处理软件发送的控制命令的格式和内容是否与接口协议保持一致。
2.1.6点迹、航迹处理功能检查
点迹、航迹处理是雷达数据处理软件的一个关键功能,主要实现点迹预处理、航迹起始和航迹关联等功能。主要进行如下检查。
a)检查点迹预处理的判断条件是否正确。例如:检查速度窗、角度窗和距离窗的值是否设置正确,进行波束相关的雷达帧数是否正确。以下举例一个典型的问题:程序中距离窗的门限值与设计文档不一致。该门限值设置偏小,这可能导致将同一个目标识别为不同目标,从而影响雷达的功能。在实际测试中,应依据设计文档,检查各门限值设置是否正确。
b)检查航迹起始的条件是否正确。例如:测量和潜在航迹的判断距离门限、角度门限是否设置正确等。
2.2建立雷达数据处理专业代码审查单
在建立通用C语言代码审查单知识库和雷达数据处理专业代码审查要素知识库后,将两个知识库的要素进行融合,形成基于专业领域的代码审查单。以下是基于雷达数据处理专业领域的代码审查单的一部分内容。
a)检查数据引用。检查雷达上电默认工作参数变量、数组等是否正确声明和初始化。
b)检查控制流程。检查定时器相关的控制流程是否正确,软件是否能按预期的时间进行系统调度。
c)依据软件设计说明书,检查典型的边界,例如:角度边界、高度边界、距离边界和速度边界等边界值的设置是否与设计说明书一致。
d)检查是否存在比较错误。检查波束相关的速度窗、角度窗和距离窗的判断条件是否正确。
e)检查子程序参数。检查控制命令的发送对象是否正确。
……
普通测试工程师分别采用传统代码审查方法与专业领域的代码审查方法对实际工程中不同代码规模的项目数据进行了测试,得到的代码审查数据统计表和统计图分别如表2和图2-3所示。
从表2和图2可以观察到,对不同代码规模的项目进行审查时,采用专业领域代码审查方法比采用传统代码审查方法发现的有价值的问题的千行代码缺陷率均有大幅度的提高。从表2和图3可以观察到,对不同代码规模的项目进行审查时,采用专业领域代码审查方法明显比采用传统代码审查方法所需工时短,且代码规模越大,节省工时就越多,代码审查效率也就越高。
表2 代码审查数据统计表
图2 代码规模与分别采用两种不同的方法发现的有价值的问题的千行代码缺陷率之间的关系图
图3 代码规模与采用两种方法所需工时之间的关系图
本文针对传统的代码审查方法存在的问题,提出了一种基于专业领域的软件代码审查方法。在实际工程应用中,使用该方法有益于测评机构内代码审查实践经验的有效传递。一般情况下,测试人员采用该方法对专业领域的软件进行代码审查时,可以快速地适应繁重复杂的测评工作,显著地提高测试效率,充分地发现深层次的软件缺陷,从而保证被测软件的质量。
[1]RON Patton.软件测试 [M].张小松,王珏,曹越,等译.北京:机械工业出版社,2006.
[2]黎连业,王华,李淑春.测试技术 [M].北京:清华大学出版社,2009.
[3]黎连业,王华,李淑春.测试技术 [M].北京:清华大学出版社,2006.
[4]MERRILL I Sko1nik.雷达系统导论 [M].左群,徐国良,马林,等译.北京:电子工业出版社,2010.
[5]何友,修建娟,关欣.雷达数据处理及应用 (第三版)[M].北京:电子工业出版社,2013.
Research on Code Inspection Method of Software in Particular Fields
Zhou Jing-ke
(CEPREI,Guangzhou 510610,China)
Code inspection is an important way to find software defects and ensure software qua1ity.Nowadays,traditiona1 code inspection method is usua11y used in the code inspection of therefore,software in particu1ar fie1ds,but there are sti11 some prob1ems in the traditiona1 code inspection,so a code inspection method of software in particular fields is proposed.It turns out that the method can effective1y find software defects and significant1y improve the efficiency of software testing in engineering practice.
code inspection;particu1ar fie1d;software testing
TP 311.55
A
1672-5468(2016)03-0039-06
10.3969/j.issn.1672-5468.2016.03.008
2016-01-19
2016-05-09
周景科 (1987-),女,四川自贡人,工业和信息化部电子第五研究所软件质量工程研究中心工程师,硕士,主要从事软件测评工作。
我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自各大过期杂志,内容仅供学习参考,不准确地方联系删除处理!