一种用于检测中断驱动型程序数据竞争的系统的制作方法

文档序号:6340366阅读:252来源:国知局
专利名称:一种用于检测中断驱动型程序数据竞争的系统的制作方法
技术领域
本发明涉及一种检测数据竞争的系统,特别是涉及一种用于检测中断驱动型程序 数据竞争的系统,属于计算机软件测试与验证技术。
背景技术
数据竞争是并发程序中一种复杂的程序行为,它发生在多个并发执行流(如线 程、任务、中断)对同一数据单元进行同时读写,且至少其中一个操作是写操作时。由于数 据竞争中涉及的两次访问之间的次序不可确定,程序可能会因此产生异常行为,严重时甚 至会导致软件或系统失效。然而,数据竞争具有小概率的特点,往往需要在特定的外部环 境、执行流切换条件下才会发生,且难以复现,对其调试和测试都很困难。因而,数据竞争的 自动检测方法和工具近年来一直都是业界的重要关注点。值得注意的是,目前已知的数据竞争检测方法大都面向多线程程序,如微软 公司的200510063733.0号专利“用于检测多线程程序中潜在竞争的方法和系统”、ACM Symposium on Operating Systems Principles (SOSP' 2003)中 Engler 等人的"RacerX : Effective, static detection of race conditions and deadlocks,,、ACMSIGS0FT Symposium on the Foundations of Software Engineering (FSE' 2007)中 Voung 等人的 "RELAY static race detection on millions of lines of code”,等等。这些针对多线 程程序的方法大多无法适用于中断驱动型程序的数据竞争检测,主要原因如下(1)中断的并发语义特征、同步、抢占关系与线程不同。具体来讲,对于中断驱动型 程序,程序编写者一般通过开关中断的方式保证操作不被中断,而对于多线程程序,程序编 写者一般采用特定的同步机制(如同步锁、信号量等)避免数据竞争;中断往往是由外界条 件触发,而线程则是由线程调度器按照一定的算法调度而获得执行权;中断的抢占关系是 非对称的,即高优先级的中断可以抢占低优先级中断,反之则不然,对于线程,这种关系是 对称的。(2)中断驱动型程序是典型嵌入式软件,与硬件交互频繁,运行环境特殊,程序的 执行状态易被外界改变,因此,在数据流分析等方面与传统程序不同。而另一方面,由于缺乏相应的自动分析工具,中断驱动型程序的开发者一般通过 传统的软件测试方法来试图发现数据竞争,即设计测试用例、执行测试用例、查看运行状态 的方式。这种手段针对性不强,只能依赖重复地执行软件并观察运行结果来检查数据竞争 是否存在,而且,即使在某次测试中发现了问题,也难以复现;由于测试是无法穷举所有程 序执行状态的,很多潜在的数据竞争也因此被遗漏掉,造成隐患;此外,嵌入式软件的运行 倚赖外部设备和环境,无法在软件开发的早期实施测试活动,导致数据竞争往往只能在后 期阶段被发现,此时缺陷修复的代价巨大。

发明内容
本发明的技术解决问题是克服现有技术的不足,提供一种用于检测中断驱动型程序数据竞争的系统,本发明基于静态分析技术,以被检测程序的目标代码或源代码为输 入,获取被检测程序的多种状态信息,在此基础上识别出程序中潜在的数据竞争,检测精确度尚。本发明的技术解决方案是一种用于检测中断驱动型程序数据竞争的系统,由前 端处理器和数据竞争分析引擎组成;所述前端处理器包括反汇编器、词法/语法分析器、 控制流图构造器、函数调用关系图构造器;所述数据竞争分析引擎包括中断优先级分析 模块、中断状态分析模块、内存访问分析模块和竞争条件识别器;反汇编器用于将被测目标程序进行反汇编并输出汇编代码;词法/语法分析器对被测程序的源代码或汇编代码进行词法分析、语法分析,输 出抽象语法树和符号表;控制流图构造器利用抽象语法树和符号表为被测程序中每个函数构造出控制流 图;函数调用关系图构造器利用抽象语法树和符号表为被测程序构造出函数调用关 系图;中断优先级分析模块,用于分析控制流图中每个结点处对应的中断优先级状态, 中断优先级分析方法为(1)从被测程序的控制流图入口点处开始进行遍历并记录每个控制流图结点处的 程序状态;(2)设结点N当前IP寄存器的状态为S ;(3)如果结点N中的语句修改了 IP寄存器的值,设值为X,则更新结点N的状态S ={X};(4)如果结点N中包含函数调用,设被调用函数为F,则首先查找是否存在函数F 的缓存记录,如果存在函数F的缓存记录则应用缓存,并取得缓存中记录的输出状态为S1, 将IP寄存器状态更新为S1 ;如果不存在函数F的缓存记录则对函数F的控制流程图进行分 析,根据分析结果得到函数F的输出状态S2,将IP寄存器状态更新为S2,并利用函数F的输 出状态&更新函数F的缓存记录,缓存中记录的是输入状态与输出状态的对应关系;(5)根据结点N的IP状态判断该结点N的优先级;中断状态分析模块,用于计算控制流图中每个结点处对应的中断使能状态;中断 状态分析的方法为(a)从被测程序的控制流图入口点处开始进行遍历并记录每个控制流图结点处的 程序状态;(b)设结点N当前IE寄存器的状态为S ;(c)如果结点N中的语句修改了 IE寄存器的值,设值为X,则更新结点N的状态S ={X};(d)如果结点N中包含函数调用,设被调用函数为F,则首先查找是否存在函数F 的缓存记录,如果存在函数F的缓存记录则应用缓存,并取得缓存中记录的输出状态为S1, 将IE寄存器状态更新为S1 ;如果不存在函数F的缓存记录则对函数F的控制流程图进行分 析,根据分析结果得到函数F的输出状态S2,将IE寄存器状态更新为S2,并利用函数F的输 出状态&更新函数F的缓存记录,缓存中记录的是输入状态与输出状态的对应关系;
(e)根据结点N的IP状态以及IE状态判断该结点N是否允许中断,对于每个允许 进入的中断I的控制流程图进行分析,根据分析结果得到中断I的输出状态为s3,IE寄存 器状态更新为S = S U &;内存访问分析模块,用于获取控制流图中每个结点处的数据读写情况,根据每个 结点处的数据读写情况计算出每个中断处理程序的内存访问集合;每个中断处理程序内存 访问集合的计算方法为(A)从中断处理程序A的入口处开始遍历控制流程图,设置A的内存访问集合R为 空;(B)将该节点的内存访问状态集合合并到R中;(C)若该节点是函数调用,则把被调用函数的内存访问集合合并到R中;(D)根据该节点的中断使能状态和中断优先级状态,将优先级大于A且中断使能 允许的中断的内存访问集合合并到R ;竞争条件识别器,根据中断优先级分析模块、中断状态分析模块和的内存访问分 析模块的分析结果,识别出每个被测程序结点处存在的数据竞争,并生成数据竞争检测报

1=1 O本发明与现有技术相比的优点在于本发明采用静态检测方法,以源代码或汇编 代码为输入,无需运行被测程序,能够在软件开发的早期阶段应用,自动化程度较高;对中 断使能状态进行了迭代的过程间分析,其中,“迭代”能够最大限度地收集所有可能的中断 切换情况,减少数据竞争检测的漏报;“过程间”考虑了函数调用以及中断进入对程序状态 的影响,在过程间分析中采用了状态缓存策略,避免在相同上下文条件下对同一函数的重 复分析,提高了检测的精确度和检测效率。


图1为本发明检测系统的组成结构框图;图2为本发明检测系统的检测流程图;图3为本发明中断状态分析模块的分析流程图。
具体实施例方式如图1所示,一种用于检测中断驱动型程序中数据竞争的系统,由前端处理器和 数据竞争分析引擎组成;所述前端处理器包括反汇编器、词法/语法分析器、控制流图构 造器、函数调用关系图构造器;所述数据竞争分析引擎包括中断优先级分析模块、中断状 态分析模块、内存访问分析模块和竞争条件识别器反汇编器用于将被测目标程序进行反汇编并输出汇编代码;词法/语法分析器对被测程序的源代码或汇编代码进行词法分析、语法分析,输 出抽象语法树和符号表;若用户给定的是被测程序的目标代码,则首先对其进行反汇编得 到对应的汇编代码,作为下一步分析的输入代码;若用户给定的是源程序,则源程序作为输 入代码;控制流图构造器利用抽象语法树和符号表,为被测程序中每个函数构造出控制 流函数调用关系图构造器利用抽象语法树和符号表,为被测程序构造出函数调用 关系图;调用关系图是一个有向图,其中每个结点代表一个函数,每条边代表边的两个顶点 代表的函数之间存在调用关系;控制流图是程序中函数的一种中间表示,其与程序源代码 等价,是一个有向图,其中每个结点表示一个语句或一个基本块(连续且没有分支跳转语 句的语句序列),每条边表示程序执行过程中的可能选择,控制流图类似程序的一个流程 图,将程序转化为图进行分析是程序静态分析领域的一种常规做法。中断优先级分析模块,用于分析控制流图中每个结点处对应的中断优先级状态, 中断优先级分析方法为(1)从被测程序的控制流图入口点处开始进行遍历并记录每个控制流图结点处的 程序状态;(2)设结点N当前IP寄存器的状态为S ;(3)如果结点N中的语句修改了 IP寄存器的值,设值为X,则更新结点N的状态S ={X};(4)如果结点N中包含函数调用,设被调用函数为F,则首先查找是否存在函数F 的缓存记录,如果存在函数F的缓存记录则应用缓存,并取得缓存中记录的输出状态为S1, 将IP寄存器状态更新为S1 ;如果不存在函数F的缓存记录则对函数F的控制流程图进行分 析,根据分析结果得到函数F的输出状态S2,将IP寄存器状态更新为S2,并利用函数F的输 出状态&更新函数F的缓存记录,缓存中记录的是输入状态与输出状态的对应关系;(5)根据结点N的IP状态判断该结点N的优先级;中断状态分析模块,用于计算控制流图中每个结点处对应的中断使能状态,即哪 些中断使能是打开的,哪些是关闭的;中断状态分析的方法为(a)从被测程序的控制流图入口点处开始进行遍历并记录每个控制流图结点处的 程序状态;(b)设结点N当前IE寄存器的状态为S ;(c)如果结点N中的语句修改了 IE寄存器的值,设值为X,则更新结点N的状态S ={X};(d)如果结点N中包含函数调用,设被调用函数为F,则首先查找是否存在函数F 的缓存记录,如果存在函数F的缓存记录则应用缓存,并取得缓存中记录的输出状态为S1, 将IE寄存器状态更新为S1 ;如果不存在函数F的缓存记录则对函数F的控制流程图进行分 析,根据分析结果得到函数F的输出状态S2,将IE寄存器状态更新为S2,并利用函数F的输 出状态&更新函数F的缓存记录,缓存中记录的是输入状态与输出状态的对应关系;(e)根据结点N的IP状态以及IE状态判断该结点N是否允许中断,对于每个允许 进入的中断I的控制流程图进行分析,根据分析结果得到中断I的输出状态为s3,IE寄存 器状态更新为S = S U &;内存访问分析模块,获取CFG中每个结点的数据读写情况,即对哪些共享数据进 行了访问,是读操作还是写操作;用于获取控制流图中每个结点处的数据读写情况,根据每 个结点处的数据读写情况计算出每个中断处理程序的内存访问集合;每个中断处理程序内 存访问集合的计算方法为(A)从中断处理程序A的入口处开始遍历控制流程图,设置A的内存访问集合R为空;(B)将该节点的内存访问状态集合合并到R中;(C)若该节点是函数调用,则把被调用函数的内存访问集合合并到R中;(D)根据该节点的中断使能状态和中断优先级状态,将优先级大于A且中断使能 允许的中断的内存访问集合合并到R ;竞争条件识别器,根据中断优先级分析模块、中断状态分析模块和的内存访问分 析模块的分析结果,识别出每个被测程序结点处存在的数据竞争,并生成数据竞争检测报 告。例如,当前结点对内存单元或变量M进行访问时,若中断进入,也对M进行了访问,则根 据表1可确定此次访问是否造成数据竞争。
权利要求
1. 一种用于检测中断驱动型程序数据竞争的系统,其特征在于由前端处理器和数据 竞争分析引擎组成;所述前端处理器包括反汇编器、词法/语法分析器、控制流图构造器、 函数调用关系图构造器;所述数据竞争分析引擎包括中断优先级分析模块、中断状态分 析模块、内存访问分析模块和竞争条件识别器;反汇编器用于将被测目标程序进行反汇编并输出汇编代码; 词法/语法分析器对被测程序的源代码或汇编代码进行词法分析、语法分析,输出抽 象语法树和符号表;控制流图构造器利用抽象语法树和符号表为被测程序中每个函数构造出控制流图; 函数调用关系图构造器利用抽象语法树和符号表为被测程序构造出函数调用关系图;中断优先级分析模块,用于分析控制流图中每个结点处对应的中断优先级状态,中断 优先级分析方法为(1)从被测程序的控制流图入口点处开始进行遍历并记录每个控制流图结点处的程序 状态;(2)设结点N当前IP寄存器的状态为S;(3)如果结点N中的语句修改了IP寄存器的值,设值为X,则更新结点N的状态S ={X};(4)如果结点N中包含函数调用,设被调用函数为F,则首先查找是否存在函数F的缓 存记录,如果存在函数F的缓存记录则应用缓存,并取得缓存中记录的输出状态为S1,将IP 寄存器状态更新为S1 ;如果不存在函数F的缓存记录则对函数F的控制流程图进行分析,根 据分析结果得到函数F的输出状态S2,将IP寄存器状态更新为&,并利用函数F的输出状 态&更新函数F的缓存记录,缓存中记录的是输入状态与输出状态的对应关系;(5)根据结点N的IP状态判断该结点N的优先级;中断状态分析模块,用于计算控制流图中每个结点处对应的中断使能状态;中断状态 分析的方法为(a)从被测程序的控制流图入口点处开始进行遍历并记录每个控制流图结点处的程序 状态;(b)设结点N当前IE寄存器的状态为S;(c)如果结点N中的语句修改了IE寄存器的值,设值为X,则更新结点N的状态S ={X};(d)如果结点N中包含函数调用,设被调用函数为F,则首先查找是否存在函数F的缓 存记录,如果存在函数F的缓存记录则应用缓存,并取得缓存中记录的输出状态为S1,将IE 寄存器状态更新为S1 ;如果不存在函数F的缓存记录则对函数F的控制流程图进行分析,根 据分析结果得到函数F的输出状态S2,将IE寄存器状态更新为&,并利用函数F的输出状 态&更新函数F的缓存记录,缓存中记录的是输入状态与输出状态的对应关系;(e)根据结点N的IP状态以及IE状态判断该结点N是否允许中断,对于每个允许进入 的中断I的控制流程图进行分析,根据分析结果得到中断I的输出状态为S3,IE寄存器状 态更新为S = S U &;内存访问分析模块,用于获取控制流图中每个结点处的数据读写情况,根据每个结点处的数据读写情况计算出每个中断处理程序的内存访问集合;每个中断处理程序内存访问 集合的计算方法为(A)从中断处理程序A的入口处开始遍历控制流程图,设置A的内存访问集合R为空;(B)将该节点的内存访问状态集合合并到R中;(C)若该节点是函数调用,则把被调用函数的内存访问集合合并到R中;(D)根据该节点的中断使能状态和中断优先级状态,将优先级大于A且中断使能允许 的中断的内存访问集合合并到R ;竞争条件识别器,根据中断优先级分析模块、中断状态分析模块和的内存访问分析模 块的分析结果,识别出每个被测程序结点处存在的数据竞争,并生成数据竞争检测报告。
全文摘要
本发明公开了一种用于检测中断驱动型程序数据竞争的系统,该系统由前端处理器和数据竞争分析引擎组成;其中前端处理器包括反汇编器、词法/语法分析器、控制流图构造器、函数调用关系图构造器;数据竞争分析引擎包括中断优先级分析模块、中断状态分析模块、内存访问分析模块和竞争条件识别器。本发明采用静态检测方法,以源代码或汇编代码为输入,无需运行被测程序,能够在软件开发的早期阶段应用,自动化程度较高;对中断使能状态进行了迭代的过程间分析,其中,“迭代”能够最大限度地收集所有可能的中断切换情况,减少数据竞争检测的漏报;“过程间”考虑了函数调用以及中断进入对程序状态的影响,提高了检测的精确度和检测效率。
文档编号G06F9/46GK102063328SQ20101061169
公开日2011年5月18日 申请日期2010年12月17日 优先权日2010年12月17日
发明者于志杰, 侯成杰, 吴瑾, 左万娟, 张西超, 张金巍, 曾霞, 武占峰, 段永顥, 董燕, 郭向英, 陈睿, 魏鹏 申请人:北京控制工程研究所
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1