嵌入式软件资源冲突自动检测系统设计

2017-03-23 10:21烁,周
电子设计工程 2017年5期
关键词:运算符标识符

白 烁,周 晴

(1.中国科学院国家空间科学中心 北京100190;2.北京理工大学 北京100181;3.中国科学院大学 北京100190)

嵌入式软件资源冲突自动检测系统设计

白 烁1,3,周 晴1,2

(1.中国科学院国家空间科学中心 北京100190;2.北京理工大学 北京100181;3.中国科学院大学 北京100190)

由于在众多的软件测试工具中,能自动检测共享资源冲突的软件非常少,而共享资源冲突问题是嵌入式软件研制中最常犯的、最不易发现、隐藏最深的问题之一,同时该问题一旦发生,带来的影响后果也极为严重,可能导致软件无法正常运行。为了解决这一问题,本文分析了共享资源冲突情况,并提出了一种针对嵌入式软件共享资源冲突问题检测的方案,使用C#语言编程,实现了自动检测系统,并进行了相关验证。

软件测试;资源冲突;自动检测;嵌入式软件

目前嵌入式软件应用越来越广泛。软件规模日益庞大、结构趋于复杂,对软件测试水平提出了更高的要求[1]。在嵌入式系统中,由于系统高实时性要求,经常使用嵌入式实时操作系统和中断技术,使专用软件操作更加灵活,功能更加强大,但同时这也可能会导致共享资源冲突。这种冲突在早期不易被人发现,在运行中一旦发生造成的后果是严重的,可能引入系统崩溃[2]。目前对于软件共享资源冲突检测的软件少之又少,主要通过人工代码走查来检测资源冲突,过于依赖测试人员的个人经验,漏检概率较大[3]。基于“早测试、早发现”的原则[4],本设计采用静态分析的方法,通过词法分析、语法分析、语义分析以及软件并发性分析,在软件开发早期对代码进行自动检测,判断是否存在共享资源冲突问题[5]。本系统主要针对嵌入式软件中最常用的 80C51系统和VxWorks系统而设计的。

1 共享资源冲突情况分析

1.1 资源冲突类型分析

资源冲突产生的根本原因是在嵌入式软件中存在不同优先级的任务或中断,低优先级任务运行至任意位置随时可能被高优先级任务或中断打断。若软件对共享资源保护不足,即资源在使用(引用或修改)前未关中断,使用后开中断,将导致不同级别任务使用的同一资源数据不一致或不完整,甚至错误。

资源冲突归为3种类型:引用——修改冲突,修改——引用冲突,修改——修改冲突[6]。

1)引用——修改冲突即正在运行的函数中引用某共享资源时,被响应的高优先级函数或中断函数修改了该共享资源。如图1所示,图1左中的函数引用了共享资源a,图1右中的优先级高的中断函数中修改了共享资源a,会造成资源引用冲突。Start函数中y运行的结果并不是期望的8,而是中断修改后的1。

图1 引用--修改冲突

2)修改——引用冲突即正在运行的函数中修改某共享资源时,被响应的高优先级函数或中断函数引用了该共享资源。如图2所示,左图中的函数修改了共享资源a,当i=1,a[1]=1;之后被优先级高的中断打断,右图中的优先级高的中断函数中引用了共享资源a,出现数组b并不与数组a一致(a[3]= {1,2,3},b[3]={1,0,0}),导致数组b获取数组a数据不完整。

图2 修改--引用冲突

3)修改——修改冲突即正在运行的函数中修改某共享资源时,被响应的高优先级函数或中断函数修改了该共享资源。如图3所示,左图中的函数修改了共享资源a,当i=1,a[1]=1;之后被优先级高的中断打断,右图中的优先级高的中断函数中也修改了共享资源a[0],会造成资源不一致。Start函数中数组a运行结果并不是期望的0、1、2,而变为5、1、2。

1.2 共享资源分析

通过分析,归纳出以下几种发生冲突的共享资源的形式:

图3 修改--修改冲突

1.2.1 单字节变量

嵌入式软件中,在内部存储区定义的单字节变量,若未进行资源保护,会引起引用——修改;在外部存储区定义的单字节变量,通过编译后实质也是执行多条语句,则可能会发生引用——修改、修改——引用或修改——修改类型3种类型的共享资源冲突。

1.2.2 多字节变量

共享资源是多字节变量,如果未进行资源保护,也会发生同类错误。如图4所示的CPU为80C32单片机的代码实例中,变量X_PowerOnCount定义为整型2字节,由于指令数据都是按字节操作,主程序读取X_PowerOnCount实际是分为两步,先读低字节再读高字节。期间若发生中断,中断服务程序改写该变量, 程序会出错。 假定主程序访问变量X_PowerOnCount值为0x12FC时,主程序首先读取了低字节 0xFC,此时中断发生该变量改写为0x1310,中断返回后主程序读取的值为0x13FC,导致主函数代码执行出错,发生引用——修改冲突。

图4 代码实例

1.2.3 寄存器地址(包括宏定义的地址)

在嵌入式软件中,软件可以直接读取寄存器地址(包括宏定义的地址)的数据,因此寄存器地址(包括宏定义的地址)也是一种共享资源。下面给出一个寄存器地址发生共享资源冲突的例子。图5为某嵌入式软件的主循环程序流程图,图6为该嵌入式软件的其中一个中断服务程序流程图。由图5和图6可以看出,当主循环从“读取CAN状态寄存器(B)”到“关闭中断”准备发送数据帧前,中断服务程序判断CAN芯片不为发送状态且芯片发送缓冲区为空闲,则向CAN芯片写入一帧数据。当中断服务程序执行结束后,主循环从被中断语句继续执行,这是主循环依据“读取CAN状态寄存器(B)”获得的过时状态,判断出CAN芯片不是发送状态且芯片发送缓冲区为空闲,主循环错误地向CAN芯片写入一帧新数据。因此,造成由于中断已向CAN芯片写入一帧数据,发送尚未正常结束时主循环又向其写入另一帧数据,导致先写入的数据被覆盖或后写入的数据丢失。发生修改——修改冲突。

图5 主循环程序流程图

1.2.4 形 参

上述单字节、多字节公共变量、寄存器地址在函数中,若以形参方式进行传递,可能在被调用的函数内发生引用或修改,若未进行资源保护,可能会造成隐式的共享资源冲突。

1.2.5 指 针

共享资源是大块数据,软件通常采用指针方式来操作大块数据,同理在对大块数据进行读写操作时,若未进行保护,也会造成资源冲突,引起数据不完整或不正确。

图6 中断服务程序流程图

2 系统实现方案

本系统针对上述类型冲突完成自动检测,采用C#语言,使用SQL Server数据库记录中间结果。系统的体系结构分为前端的winform界面、后端的数据搜索以及数据分析。从前端界面加载代码,由后端程序处理数据,再由前端界面显示结果。系统的总体流程图如图7所示。

图7 系统流程图

1)词法分析

对源程序文本文件进行扫描,提炼关键词,词是语言中具有独立意义的最小单位。对关键词进行词法分析,识别包括关键字、标识符、运算符、界符、常量和变量等。

由于除C语言中固定的关键字外,程序员可能会自定义变量类型和关键字(例如:#define LOCALstatic;typedefsigned charINT8),所以也需要扫描、识别出程序员自定义的变量类型及关键字。此外,还需查找出程序员声明的结构体以及共用体,以便进行语法分析时使用。

2)语法分析

本系统采用自顶向下的语法分析方法,即给定文法G和源程序串r。从G的开始符号S出发,通过反复使用产生式对句型中的非终结符进行替换 (推导),逐步推导出r。在完成词法分析基础上,进一步进行语法分析,包括:

① 提取出该源代码中所有的函数,并获取每个函数的基本信息,包括函数名称、函数所在文件,函数所在的任务。

②利用①中的分析结果进行二次分析,获取该程序中所有任务的信息,包括任务名称、任务优先级及每个任务所调用的函数。

③ 分析形成源代码程序中声明的所有的共享资源,包括资源名称及资源类型。

④ 利用以上三条分析结果,获取所有共享资源的使用情况,包括共享资源名称、使用该资源的函数、所在的任务名称及读写情况。

3)语义分析

在语法分析基础上,进行一步分析获得所有共享资源的使用情况,包括共享资源名称、使用该资源的函数、所在的任务名称及共享资源在不同函数中读写情况。中断服务程序也可看成是一种任务。

4)软件并发性分析

本阶段是一个逻辑判断过程,依据前文提及的共享资源冲突分析形成冲突规则集,对共享资源使用情况进行规则检查,分析是否有同一共享资源同时出现在了两个优先级不同的任务中。若违反规则则给出初步警告。

根据给出的警告信息,逐条返回到优先级较低的函数中,查看被测软件在使用该资源前是否关闭中断或者禁止高优先级任务抢占,若没有则提醒该共享资源会发生冲突。

3 结 论

根据以上方案,编程实现了针对C51系统及VxWorks系统检测共享资源冲突的测试工具。本设计对某嵌入式软件的源代码进行共享资源冲突测试,结果显示该系统可以提示出该软件的源代码中可能发生的包括引用——修改、修改——引用及修改——修改这三种类型的共享资源冲突问题的共享资源名称及使用该共享资源的函数及所在任务、读写操作等信息。本系统可对单字节变量、多字节变量、形参及寄存器地址类型的共享资源进行自动检测。下一阶段将完成对指针类型的共享资源进行检测。

[1]单锦辉,姜瑛,孙萍.软件测试研究进展[J].北京大学学报:自然科学版,2005(1):134-145.

[2]王雅文,宫云战,杨朝红.软件测试工具综述[J].北京化工大学学报,2007(S1):1-4.

[3]金凌紫.面向对象软件测试技术进展[J].计算机研究与发展,1998(1):6-13.

[4]宋颖.面向嵌入式C的软件缺陷检测技术的研究与实现[D].北京:北京邮电大学,2011.

[5]文昌辞,王昭顺.软件测试自动化静态分析研究[J].计算机工程与设计,2005(4):987-989.

[6]杨芳,齐璇,董丽,等.嵌入式软件中断系统资源冲突检测技术研究[J].计算机工程与设计,2010,31(23):5036-5038.

[7]人杰.计算机软件测试技术[M].北京:清华大学出版社,1992.

[8]航天.航天型号软件测试[M].北京:宇航出版社,1999.

[9]朱少民.软件测试方法和技术[M].北京:清华大学出版社有限公司,2005.

[10]R.·帕顿(美),Patton R,周予滨,等.软件测试[M].北京:机械工业出版社,2002.

[11]鞠秀娟,赵明.软件自动化测试概述及应用工具分析[J].计算机应用,2007,27(B06):317-318.

[12]杨宇,张健.程序静态分析技术与工具[J].计算机科学,2004,31(2):171-174.

[13]张健.精确的程序静态分析[J].计算机学报,2008,31(9):1549-1553..

[14]锡滋.软件可靠性,安全性与质量保证 [M].北京:电子工业出版社,2002.

[15]蔡开元.软件可靠性工程基础[M].北京:清华大学出版社,1995.

Design of resource conflicts detection system for embedded software

BAI Shuo1,3,ZHOU Qing1,2
(1.National Space Science Center.CAS,Beijing 100190,China 2.Beijing Institute of Technology,Beijing 100181,China;3.University of Chinese Academy of Sciences,Beijing 100190,China)

Among the many software testing tools,the number of detecting shared resources conflict is very small,but the problem of shared resource conflict is often happened and is hard to be discovered,which can lead to serious consequences.In order to find the problem of the software as soon as possible,the conflicts are firstly analyzed,and then a scheme of testing shared resource conflicts for embedded software is brought forward,which can realize automatic detection.

software testing;resource conflicts;automatic detection;embedded software

TN0

:A

:1674-6236(2017)05-0061-04

2016-01-21稿件编号:201601192

白 烁(1990—),女,河北衡水人,硕士研究生。研究方向:软件测试。

猜你喜欢
运算符标识符
基于底层虚拟机的标识符混淆方法
老祖传授基本运算符
DOI标识符查找文献的方法
基于区块链的持久标识符系统①
用手机插头的思路学习布尔运算符
数字美术馆“数字对象唯一标识符系统”建设需求浅议
C语言中自增(自减)运算符的应用与分析
科研人员唯一标识符的理论研究现状剖析
数字图书馆推广工程唯一标识符体系构建研究*
表达式求值及符号推导