动静态结合的中断驱动程序数据竞争检测方法

文档序号:6619580阅读:233来源:国知局
动静态结合的中断驱动程序数据竞争检测方法
【专利摘要】本发明设计一种动静态结合的中断驱动程序数据竞争检测方法,该方法通过共享资源的检测技术、控制流图生成技术、数据流分析技术、模拟器运行控制技术,利用静态方法来对源程序进行静态分析得到潜在的数据竞争序列,通过对静态分析的结果进行动态执行,验证潜在竞争的真实性,并根据潜在竞争的严重性进行排序,得到测试结果报告。通过本发明实现的工具对中断驱动程序的测试,可以有效地检测出真实的中断相关的竞争关系,并根据严重性提供一系列的潜在竞争关系作为指导,能够极大地促进测试人员的工作效率,突破解决了中断驱动的数据竞争检测问题,保障嵌入式系统的安全和稳定,可以为航天、医疗等高稳定性嵌入式程序需求的关键性安全领域提供可靠性保证。
【专利说明】动静态结合的中断驱动程序数据竞争检测方法

【技术领域】
[0001] 本发明涉及中断驱动程序的测试方法,主要涉及中断引发的嵌入式系统中的数据 竞争检测,属于软件工程、软件测试、嵌入式系统交叉【技术领域】。

【背景技术】
[0002] 嵌入式系统被广泛应用在各个领域,包括汽车电子、航天电子、医疗电子等。这些 领域往往对安全性和稳定性的要求特别高,任何的系统运行故障都会导致及其严重的后 果,比如著名的Therac-25事件,就是在某些种特殊场景下的一次不小心的按键动作,导致 了中断引发的数据竞争,最终了严重的医疗后果。
[0003] 中断驱动的嵌入式系统的稳定和安全具有很高的重要性,但嵌入式系统程序的错 误,尤其是其并发性错误,被认为是极其难以检测、定位和修复的。这主要是因为并发错误 对执行序列很敏感,即使是同一测试用例,每次的执行序列都有可能不同,最终造成无法预 测程序的执行结果。因此,依赖传统的通过检查程序输出结果来判断程序错误的方法,无法 检测出大多数的并发错误。此外,中断本身和硬件紧密相关,系统运行环境复杂,更加剧了 对并发错误的检测、定位和修复的难度。
[0004] 如何设计一个较为完整的能够检测中断驱动的嵌入式系统中数据竞争的自动化 方法,来有效、高效地帮助测试人员提供工作效率,保障安全性嵌入式系统的稳定性和鲁棒 性,是我们一直在思考的问题。
[0005] 传统的解决方法有:通过将中断驱动程序转换成多线程程序,然后利用多线程中 的数据检测工具找到竞争问题,然而,中断驱动程序和多线程程序在诸多方面的特性存在 着本质的区别,二者的转换势必造成信息量的丢失,导致报告结果的误报;采用随机化调 度、基于共享变量访问的调度等方法,通过对程序的插桩来动态执行程序,找到竞争问题, 但是,由于其强制的路径执行方法造成了诸多误报,且大量的人工操作影响了工具的实用 性,导致了该方法不具备可使用性;还有基于模拟器的方法,虽然能够一定程度上检测到数 据竞争问题,却因为需要监控系统的全部状态,且需要进行多次重复运行,系统开销大,时 间成本高。
[0006] 目前对中断驱动程序的数据竞争检测仍存在着两个瓶颈:一是结果的准确性问 题,在避免误报的同时能够尽量避免漏报;二是实用性问题,其测试方法应该能够不依赖于 具体的系统和平台,具有广泛的应用场景。本发明设计一种动静态结合的竞争检测方法,通 过共享资源的检测技术,控制流图生成技术,数据流分析技术,模拟器运行控制技术,检测 并验证出系统的竞争关系,突破了上述的两个瓶颈,解决了中断驱动的数据竞争检测问题, 保障嵌入式系统的安全和稳定,为我国航天事业、医疗事业等高稳定性嵌入式程序需求的 关键性安全领域提供可靠性保证。


【发明内容】

[0007] 技术问题:本发明的目的是设计一种动静态结合的中断驱动程序数据竞争检测方 法,以保障安全性嵌入式系统的稳定性和鲁棒性,解决中断驱动的嵌入式系统程序中存在 的严重威胁系统安全和稳定性的数据竞争问题。
[0008] 技术方案:本发明提供一种动静态结合的中断驱动程序数据竞争检测方法,利用 静态方法来对源程序进行静态分析得到潜在的数据竞争序列,通过对静态分析的结果进行 动态执行,验证潜在竞争的真实性,并根据潜在竞争的严重性进行排序,得到测试结果报 生 1=1 〇
[0009] 本发明的动静态结合的中断驱动程序数据竞争检测方法包含的步骤为:
[0010] 步骤1 :用户指定受测试的中断驱动程序源文件,所述的中断驱动程序源文件包 含若干个函数构成的主任务的源代码,以及该任务涉及到的中断所对应的中断处理程序的 源代码;
[0011] 步骤2:用户指定测试的配置文件,所述配置文件是XML文件,XML的全称是可扩展 标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义 的源语言;所述的测试配置文件包括主函数的入口说明、各个中断处理程序的中断向量号 和中断优先级;
[0012] 步骤3 :对受测试的中断驱动程序源文件进行共享资源检测,得到共享资源列表;
[0013] 步骤4:对受测试的中断驱动程序源文件进行中断操作行为检测,得到中断操作 列表;
[0014] 步骤5 :对中断驱动程序源文件进行分析,得到简要控制流图RCFG,
[0015] 步骤6 :将所有的RCFG互联起来,得到全局的中断互联控制流图IICFG ;
[0016] 步骤7 :对IICFG进行深度优先遍历,得到中断驱动源程序的静态分析结果;
[0017] 步骤8:在西米克斯Simics仿真平台中执行中断驱动程序源文件,验证PR中的所 有静态分析结果,
[0018] 步骤9 :对验证后的验证结果进行严重性排序,从而得到了对受测试的中断驱动 程序源文件的竞争检测结果。
[0019] 所述步骤3具体过程如下:
[0020] 步骤31 :设置共享资源列表,将该表初始化为空,所述的共享资源列表包含五个 属性,分别是共享资源所在的函数名、该共享资源所在该函数中的行号、共享资源在该函数 中的别名、该共享资源的全局的实质名称、该共享资源的读写访问类型;
[0021] 步骤32 :打开中断驱动程序源文件,逐行读取源文件数据,每当读入源文件的一 行数据时,通过语法分析该行数据中所包含的语句是否属于共享资源声明语句;所述的共 享资源包括:可全局被访问的共享变量、可共享访问的端口号、寄存器地址、可全局被访问 的文件句柄,以及上述所有的共享资源的有效的指针形式传播;如果该语句是共享资源声 明语句,则将该语句中包含的共享资源的具体信息作为共享资源列表的一行,添入到共享 资源列表中;共享资源的具体信息包括共享资源所在的函数名、该共享资源所在该函数中 的行号、共享资源在该函数中的别名、该共享资源的全局的实质名称、该共享资源的读写访 问类型。
[0022] 所述步骤4具体过程如下:
[0023] 步骤41 :读取用户指定测试的配置文件,读入本次测试的函数主入口信息、各个 中断处理程序的中断向量号、中断优先级,
[0024] 步骤42 :设置中断操作列表,将该表初始化为空;所述的中断操作列表包含四个 属性,分别是中断操作所在的函数名、该中断操作所在该函数中的行号、该中断的向量号、 该中断操作的操作类型;
[0025] 步骤43 :打开中断驱动程序源文件,逐行读取源文件数据,每当读入源文件的一 行数据时,通过语法分析判断该行数据中包含的语句是否是中断控制语句,如果是,将该中 断操作添入到中断操作列表中。
[0026] 所述步骤5具体过程如下:
[0027] 步骤51 :使用编译器LLVM对源程序进行分析,得到每个函数和中断处理程序的控 制流图CFG ;
[0028] 步骤52 :读取所有CFG,对每个CFG,依次读取其包含的每个结点;
[0029] 步骤53 :对于CFG中的每个结点,根据前述得到的共享资源列表和中断操作列表, 判断该结点是否包含有会影响共享资源的操作,即是否属于共享资源操作、中断开关操作、 条件分支判断操作;如果是,则将当前结点从当前CFG中删除,如果否,则什么都不做,判断 完当前结点后,继续往下判断下一个结点;
[0030] 步骤54 :每遍历完成一个CFG,则得到了该CFG对应的RCFG。
[0031] 所述步骤6的具体过程如下:
[0032] 步骤61 :设置一个变量INTB,将INTB初始化为0,所述INTB是用来记录当前中断 的开关情况,
[0033] 步骤62 :读取所有RCFG,对每个RCFG,进行深度优先遍历,
[0034] 所述深度优先遍历,是图的最普遍的搜索算法中的一种,它可以沿着树的深度依 次遍历树的每个结点,尽可能深地探索到树的各个分支,
[0035] 步骤63 :对于遍历到的每个结点,如果其中的语句包含函数调用操作,转到步骤 64 ;如果其中的语句包含对共享变量的操作,转到步骤65 ;如果其中的语句包含中断开关 操作,转到步骤66,否则,则什么都不做,回到步骤63继续往下遍历,
[0036] 步骤64 :将进行函数调用的结点的指针指向当前被调用函数的RCFG的入口结点, 回到步骤63继续往下遍历,
[0037] 步骤65 :根据共享资源列表,找到可能会对当前语句所包含的共享资源进行操作 的中断,考察INTB中该中断状态是否为开,如果是,则将该中断处理程序的入口结点指向 本结点,回到步骤63继续往下遍历,
[0038] 步骤66 :根据该中断开关操作的情况,更新INTB,回到步骤63继续往下遍历。
[0039] 所述步骤7的具体过程如下:
[0040] 步骤71 :从IICFG的主函数入口结点开始,对IICFG进行深度优先遍历,
[0041] 步骤72 :生成执行序列记录表RQ,将RQ初始化为空,生成静态预测结果PR,将PR 初始化为空,RQ用来记录深度优先遍历过程中的执行序列,PR用来记录遍历过程中发现的 竞争关系,
[0042] 步骤73 :在深度优先遍历过程中,每往下遍历一个结点,则将当前结点压入RQ ;每 往后回退一个结点,将当前结点退出RQ,
[0043] 步骤74:对每个结点,考察它是否包含共享资源操作语句,如果是,转到步骤75, 如果否,则回到步骤74继续往下遍历,
[0044] 步骤75 :考察所有指向当前结点的函数中,其优先级是否比当前结点所属的函数 的优先级高;如果是,转到76,如果否,则回到步骤74继续往下遍历,
[0045] 步骤76 :将当前操作的共享资源信息和RQ中的执行序列联接,构成一条竞争关系 的预测结果,添加到PR中,回到步骤74继续往下遍历。
[0046] 所述步骤8的具体过程如下:
[0047] 步骤81 :打开中断驱动程序源文件,根据已有的共享资源列表,对源文件插桩,将 源文件中的每个共享资源访问位置设置成西米克斯的读写断点,并将每个读写断点都绑定 到西米克斯的访问控制回调函数中,
[0048] 步骤82 :将静态的预测分析结果转换成西米克斯的访问控制回调函数的执行控 制脚本,
[0049] 步骤83 :在西米克斯中输入所有的测试用例,在自然执行状态下依次执行每个测 试用例,运行插桩后的中断驱动程序源文件,当预测的执行序列发生时,西米克斯的控制脚 本自动触发对应的中断向量号,如果该中断能够真实触发,则将该执行序列、测试用例、真 实发生与否的信息,作为一行数据,打印到验证结果文件中,
[0050] 步骤84:西米克斯中输入所有的测试用例,在自然执行状态下依次执行每个测试 用例,运行插桩后的中断驱动程序源文件,当预测的执行序列即将发生偏离时,通过西米克 斯的插值方式强制将偏离的分支更正成与预测的执行序列相吻合的方向,如果在需要触发 中断时能够真实触发对应的中断,则将该执行序列、测试用例、真实发生与否的信息,作为 一行数据,打印到验证结果文件中。
[0051] 所述步骤9具体过程如下:
[0052] 步骤91 :读取验证结果文件,合并执行序列相同的验证结果,每个验证结果增加 "发生次数"这一列,以统计相同的执行序列发生的次数,
[0053] 步骤92 :针对每个验证结果的真实发生与否这一属性,按照有真实发生在前,非 真实发生在后的顺序,进行一次排序,
[0054] 步骤93 :针对每个验证结果的的发生次数这一属性,按照发生次数由大到小的顺 序,对前述排序进行微调,
[0055] 步骤94:将最终的排序结果输入到测试结果文件中,从而得到了对受测试的中断 驱动程序源文件的竞争检测结果。
[0056] 有益效果:本发明给出一种动静态结合的中断驱动程序竞争检测方法,通过静态 的共享资源检测技术,控制流图生成技术,数据流分析技术,以及动态的模拟器控制中断调 度技术,能够得到程序中真实的竞争关系,具有如下的有益效果:
[0057] (1)本发明所述的方法能够有效地检测出中断驱动程序中存在的竞争关系,发现 潜在的竞争错误,具有高效的特点;
[0058] (2)本发明能够对潜在的竞争关系进行验证,在避免误报的同时,提高了检测结 果的准确率,并对验证后的竞争关系进行了严重性排序,有效地提高了人工审核的时间效 率;
[0059] (3)本发明自动化程度高,在整个测试过程中需要人工的参与很少;
[0060] (4)本发明能够应用于几乎任何系统和平台,具有较强的实用性。

【专利附图】

【附图说明】
[0061] 图1为本发明的总体系统及流程框图。
[0062] 图2为动态验证过程的流程图。

【具体实施方式】
[0063] 下面通过附图对本发明的技术方案做进一步的详细描述。
[0064] 参照图1,本发明由三个大的功能部件构成,其中每个功能部件又可细分为若干个 小的功能组件,共计七个功能组件,分别是:共享资源检测器,中断操作检测器,RCFG生成 器,IICFG生成器,潜在竞争关系预测器,动态验证执行器,竞争关系排序器。其中,共享资源 检测器将源代码中的共享资源检测出来,中断操作检测器将源代码中的所有中断相关操作 检测出来,RCFG生成器在共享资源检测器和中断操作检测器的基础上构建出只跟共享资源 相关的控制流图,而IICFG生成器则在RCFG生成器的基础上构建出中断互联的控制流图, 潜在竞争关系预测器将IICFG作为输入,预测出潜在的竞争关系,动态验证执行器会把潜 在竞争关系预测器的预测结果执行动态的执行验证,其结果作为竞争关系排序器的输入, 进行排序后得到最终的检测结果。
[0065] 在具体的实施过程中,各功能组件的工作过程以及输入输出如下:
[0066] (1)共享资源检测器
[0067] 参照图1,共享资源检测器将检测出源代码中涉及到的所有的共享资源。它将源 程序作为输入,将共享资源列表作为输出,其具体过程是:首先,初始化共享资源列表为空; 接着,打开中断驱动程序源文件,逐行读取源文件数据;每当读入源文件的一行数据时,通 过语法分析该语句是否是一个共享资源声明语句,如果是,将该共享资源的信息添入到共 享资源列表中;所有的共享资源包括如下几种类别:可全局被访问的共享变量、可共享访 问的端口号、寄存器地址、可全局被访问的文件句柄,以及上述所有的共享资源的有效的 指针形式传播;当源程序扫描完毕时,将共享资源列表保存入共享资源记录文件中,后缀名 为· SR。
[0068] 如下为对一个源程序进行共享资源检测的实例结果,通过如下的元组表示:
[0069] SV1 :<task2, 14, bufferAddr, bufferAddr, R>
[0070] SV2 :<task2, 14, RBR, bufferAddr, W>
[0071] SV3 :<task2, 15, bufferAddr, bufferAddr, R>
[0072] SV4 :<task2, 15, LSR, bufferAddr, R>
[0073] SV5 :<task2, 20, LSR, bufferAddr, W>
[0074] SV6 :<task2, 21, packetsNumber, packetsNumber, R>
[0075] SV7 :<task2, 21, packetsNumber, packetsNumber, W>
[0076] SV8 :<taskl, 30, bufferAddr, bufferAddr, W>
[0077] SV9 :<irq_handlerl, 5, bufferAddr, bufferAddr, W>
[0078] SV10 :<irq_handlerl, 7, bufferAddr, bufferAddr, R>
[0079] SV11 :<irq_handlerl, 9, packetsNumber, packetsNumber, R>
[0080] SV12 :<irq_handlerl, 9, packetsNumber, packetsNumber, W>
[0081] SV13 :<irq_handlerl, 10, bufferRemainCap, bufferRemainCap, R>
[0082] SV14 :<irq_handlerl, 12, bufferRemainCap, bufferRemainCap, R>
[0083] SV15 :<irq_handlerl, 12, bufferRemainCap, bufferRemainCap, ff>
[0084] SV16 :<irq_handler2, 27, bufferRemainCap, bufferRemainCap, ff>
[0085] (2)中断操作检测器
[0086] 参照图1,中断操作检测器将源代码中涉及到的所有的中断操作检测出来。它的输 入是源程序,输出是中断操作记录,其具体过程是:打开中断驱动程序源文件,逐行读取源 文件数据;每当读入源文件的一行数据时,通过语法分析判断该语句是否是中断控制语句, 如果是,将该中断操作添入到中断操作记录表中;将中断操作记录表保存如中断记录文件 中,后缀名为.ITR。
[0087] 如下为对一个源程序进行中断操作检测之后的实例结果,通过元组表示:
[0088] ITR1 :<task2, 13, 1, E>
[0089] ITR2 :<task2, 16, 1, D>
[0090] (3) RCFG 生成器
[0091] RCFG生成器在共享资源检测器和中断操作检测器的基础上构建出只跟共享资 源相关的控制流图,它的输入是共享资源列表、中断操作记录,输出是所有的函数对应的 RCFG,其具体流程是:使用LLVM对源程序进行语法分析,得到每个函数和中断处理程序的 CFG (Control Flow Graph);读取LLVM生成的所有CFG,对每个CFG,根据其对应的.SR文件 和.ITR文件,判断该CFG是否含有会影响共享资源的操作;如果是,则遍历该CFG,过滤出 跟影响共享资源有关的操作,得到该CFG对应的RCFG(Reduced_Control Flow Graph);最 后,将所有生成的RCFG分别保存到函数RCFG文件中,后缀名.RCFG。
[0092] (4)IICFG 生成器
[0093] IICFG生成器在RCFG生成器的基础上构建出中断互联的控制流图,它以所有函数 的RCFG为输入,将一个中断互联的控制流图IICFG作为输出,其流程为:深入优先遍历所有 的RCFG,当RCFG中的某个结点为函数调用操作时,将进行函数调用的结点的指针指向被调 用函数的RCFG的入口结点;当RCFG中的某个结点为对共享变量的操作时,从共享变量记录 表中找到对同一共享变量可能会进行操作的中断处理程序,考察INTB中该中断是否为开 状态,如果是,则将该中断处理程序的入口结点指向本结点;当RCFG中的某个结点为中断 开关操作时,根据该中断开关操作的情况,更新INTB ;最后,深入优先遍历完成后,将生成 的IICFG保存到记录文件中,后缀名.IICFG。
[0094] (5)潜在竞争关系预测器
[0095] 潜在竞争关系预测器将IICFG作为输入,预测出潜在的竞争关系。以下是其具体 流程:从IICFG的main函数入口开始对IICFG进行深入优先遍历,并首先初始化执行序列 RQ为空,初始化静态预测结果PR为空;每往下遍历一步,将当前结点压入RQ ;每往后回退 一步,当当前结点退出RQ;当某个结点是共享资源操作语句时,考察所有插入到该结点的 函数(包括中断处理程序的函数)中,优先级是否比当前函数的优先级高;如果是,将当前 操作的共享资源信息和RQ中的执行序列合并,共同输入PR中,得到一条预测结果;最后,将 PR中所有的预测结果及其执行序列,保存到预测结果记录文件中,后缀名.PR。
[0096] 如下为对一个源程序的IICFG经过潜在竞争关系预测器分析后,得到的分析结 果:
[0097] PDR(SRA1, SRA12) = {taskl<30>} | {irq_handlerl<5>}
[0098] PDR(SRA2, SRA12) = {taskl<31>, task2<20>} | {irq_handlerl<5>}
[0099] PDR(SRA4, SRA7) = {taskl<31>, task2<21>} | {irq_handlerl<7 | T>, irq_ handlerl<9>}
[0100] PDR (SRA5, SRA7) = {taskl<31>, task2<21>} | {irq_handlerl<7 | T>, irq_ handlerl<9>}
[0101] PDR (SRA8, SRA11) = {irq_handlerl<7 | T>, irq_handlerl<10>} | {irq_ handlerl<5>}
[0102] PDR (SRA9, SRA11) = {irq_handler 1<7 | T>, irq_handler 1<10 | T>, irq_ handlerl〈12>}I{irq_handler2〈27>}
[0103] PDR (SRA10, SRA11) = {irq_handlerl<7 | T>, irq_handler 1<10 | T>, irq_ handlerl〈12>}I{irq_handler2〈27>}
[0104] (6)动态验证执行器
[0105] 动态验证执行器会把潜在竞争关系预测器的预测结果执行动态的执行验证,它以 潜在竞争关系预测器的预测结果作为输入,将动态验证的结果作为输出,以下是其具体流 程:打开PR文件,将所有的执行序列转换成Simics的执行控制脚本;第一轮执行,将系统 在测试用例下自然执行,当预测的执行序列发生时,Simics的控制脚本自动触发对应的中 断向量号,如果该中断能够真实触发,则将该中断、测试用例、执行序列的信息,输入到验 证结果文件.DV文件中;对于第一轮执行中没有能够真实触发的预测结果中的执行序列, 进行第二轮执行,将系统在测试用例下执行,当预测的执行序列即将偏离时强制系统向预 测方向执行,并在需要中断时触发对应的中断向量号,如果该中断能够真实触发,则将该 中断、测试用例、执行序列的信息,输入到验证结果文件.DV文件中;对验证后的潜在竞争 进行归纳整合,统计每个潜在竞争发生的次数,标记潜在竞争的真实发生与否,重新输入 至丨J .DV文件中。
[0106] 图2为动态验证执行器的验证流程图。
[0107] (7)竞争关系排序器
[0108] 竞争关系排序器将经过动态验证执行器验证过的潜在竞争关系,进行排序后,得 到最终的检测结果。以下是其具体流程:打开.DV文件,对于每个验证后的潜在竞争,根据 该竞争真实发生与否,进行第一次排序;对于每个验证后的潜在竞争,根据该竞争的发生次 数,由大到小进行第二次排序;将排序结果输入到结果文件中,后缀名.RESULT,得到对该 源程序的竞争检测结果。
[0109] 经过对是否能够真实发生、发生次数两个维度的考量后,排过序的竞争关系如下 所示:
[0110] <PDR(SRA1, SRA12), E, 8, <tcl, tc2, tc3, tc5, tc6, tc7, tc8, tc9>>
[0111] <PDR (SRA2, SRA12), NE, 3, _ >
[0112] <PDR(SRA4, SRA7), E, 4, <tcl, tc5, tc6, tc8?
[0113] <PDR(SRA5, SRA7), E, 4, <tcl, tc5, tc6, tc8?
[0114] <PDR (SRA8, SRA11), N, 0, _ >
[0115] <PDR(SRA9, SRA11), E, 3, <tc5, tc8, tc9?
[0116] <PDR(SRA10, SRA11), E, 3, <tc5, tc8, tc9?
[0117] 本发明所述的动静态结合的中断驱动程序数据竞争检测方法包括以下步骤:
[0118] 步骤1 :用户指定受测试的中断驱动程序源文件。所述的中断驱动程序源文件一 般包含若干个函数构成的主任务的源代码,以及该任务涉及到的中断所对应的中断处理程 序的源代码。
[0119] 步骤2 :用户指定测试的配置文件。所述配置文件一般是XML文件,XML的全称是 可扩展标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进 行定义的源语言。所述的测试配置文件应该包括主函数的入口说明,各个中断处理程序的 中断向量号、中断优先级。
[0120] 步骤3 :对受测试的中断驱动程序源文件进行共享资源检测,得到共享资源列表。 步骤3具体过程如下:
[0121] 步骤31 :设置共享资源列表,将该表初始化为空,所述的共享资源列表包含五个 属性,分别是共享资源所在的函数名,该共享资源所在该函数中的行号,共享资源在该函数 中的别名,该共享资源的全局的实质名称,该共享资源的读写访问类型。
[0122] 步骤32 :打开中断驱动程序源文件,逐行读取源文件数据,每当读入源文件的一 行数据时,通过语法分析该行数据中所包含的语句是否属于共享资源声明语句。所述的共 享资源包括:可全局被访问的共享变量、可共享访问的端口号、寄存器地址、可全局被访问 的文件句柄,以及上述所有的共享资源的有效的指针形式传播。
[0123] 如果该语句是共享资源声明语句,则将该语句中包含的共享资源的具体信息,包 括共享资源所在的函数名,该共享资源所在该函数中的行号,共享资源在该函数中的别名, 该共享资源的全局的实质名称,该共享资源的读写访问类型,作为共享资源列表的一行,添 入到共享资源列表中。
[0124] 步骤4:对受测试的中断驱动程序源文件进行中断操作行为检测,得到中断操作 列表。步骤4具体过程如下:
[0125] 步骤41 :读取用户指定测试的配置文件,读入本次测试的函数主入口信息、各个 中断处理程序的中断向量号、中断优先级。
[0126] 步骤42 :设置中断操作列表,将该表初始化为空;所述的中断操作列表包含四个 属性,分别是中断操作所在的函数名,该中断操作所在该函数中的行号,该中断的向量号, 该中断操作的操作类型(开中断或关中断)。
[0127] 步骤43 :打开中断驱动程序源文件,逐行读取源文件数据,每当读入源文件的一 行数据时,通过语法分析判断该行数据中包含的语句是否是中断控制语句,如果是,将该中 断操作添入到中断操作列表中。
[0128] 步骤5 :对中断驱动程序源文件进行分析,得到简要控制流图(RCFG)。步骤5具体 过程如下:
[0129] 步骤51 :使用LLVM对源程序进行分析,得到每个函数和中断处理程序的控制流图 (CFG)。
[0130] 所述的LLVM是Low Level Virtual Machine的简称,是一个业界最知名的编译器 之一,它提供了很多与编译器相关的库支持,能够进行程序语言的编译期优化、链接优化、 在线编译优化、代码生成。我们这里使用它来得到中断驱动程序源文件的CFG。
[0131] 步骤52 :读取所有CFG,对每个CFG,依次读取其包含的每个结点;
[0132] 步骤53 :对于CFG中的每个结点,根据前述得到的共享资源列表和中断操作列表, 判断该结点是否包含有会影响共享资源的操作,即是否属于共享资源操作、中断开关操作、 条件分支判断操作;如果是,则将当前结点从当前CFG中删除,如果否,则什么都不做,判断 完当前结点后,继续往下判断下一个结点;
[0133] 步骤54 :每遍历完成一个CFG,则得到了该CFG对应的RCFG。
[0134] 步骤6 :将所有的RCFG互联起来,得到全局的中断互联控制流图IICFG。步骤6的 具体过程如下:
[0135] 步骤61 :设置一个变量INTB,将INTB初始化为0,所述INTB是用来记录当前中断 的开关情况。
[0136] 步骤62 :读取所有RCFG,对每个RCFG,进行深度优先遍历。
[0137] 所述深度优先遍历,是图的最普遍的搜索算法中的一种,它可以沿着树的深度依 次遍历树的每个结点,尽可能深地探索到树的各个分支。
[0138] 步骤63 :对于遍历到的每个结点,如果其中的语句包含函数调用操作,转到步骤 64 ;如果其中的语句包含对共享变量的操作,转到步骤65 ;如果其中的语句包含中断开关 操作,转到步骤66,否则,则什么都不做,回到步骤63继续往下遍历。
[0139] 步骤64:将进行函数调用的结点的指针指向当前被调用函数的RCFG的入口结点, 回到步骤63继续往下遍历。
[0140] 步骤65 :根据共享资源列表,找到可能会对当前语句所包含的共享资源进行操作 的中断,考察INTB中该中断状态是否为开,如果是,则将该中断处理程序的入口结点指向 本结点。回到步骤63继续往下遍历
[0141] 步骤66 :根据该中断开关操作的情况,更新INTB。回到步骤63继续往下遍历。
[0142] 步骤7 :对IICFG进行深度优先遍历,得到中断驱动源程序的静态分析结果。步骤 7的具体过程如下:
[0143] 步骤71 :从IICFG的主函数入口结点开始,对IICFG进行深度优先遍历。
[0144] 步骤72 :生成执行序列记录表RQ,将RQ初始化为空。生成静态预测结果PR,将PR 初始化为空。RQ用来记录深度优先遍历过程中的执行序列,PR用来记录遍历过程中发现的 竞争关系。
[0145] 步骤73 :在深度优先遍历过程中,每往下遍历一个结点,则将当前结点压入RQ ;每 往后回退一个结点,将当前结点退出RQ。
[0146] 步骤74:对每个结点,考察它是否包含共享资源操作语句,如果是,转到步骤75, 如果否,则回到步骤74继续往下遍历。
[0147] 步骤75 :考察所有指向当前结点的函数中,其优先级是否比当前结点所属的函数 的优先级高;如果是,转到76,如果否,则回到步骤74继续往下遍历。
[0148] 步骤76 :将当前操作的共享资源信息和RQ中的执行序列联接,构成一条竞争关系 的预测结果,添加到PR中。回到步骤74继续往下遍历。
[0149] 步骤8 :在西米克斯(Simics)仿真平台中执行中断驱动程序源文件,验证PR中的 所有静态分析结果。
[0150] 所述的西米克斯仿真平台是英特尔公司开发的一款全系统的模拟器,它可以为软 件和系统开发人员、架构师、测试工程师提供为各种目的构建和使用虚拟系统或创建多个 虚拟连接系统的方法,因其功能强大且学术版本免费向高校开放,是业界内最闻名的系统 仿真模拟器之一。
[0151] 步骤8的具体过程如下:
[0152] 步骤81 :打开中断驱动程序源文件,根据已有的共享资源列表,对源文件插桩,将 源文件中的每个共享资源访问位置设置成西米克斯的读写断点,并将每个读写断点都绑定 到西米克斯的访问控制回调函数中。
[0153] 步骤82 :将静态的预测分析结果转换成西米克斯的访问控制回调函数的执行控 制脚本。
[0154] 步骤83 :在西米克斯中输入所有的测试用例,在自然执行状态下依次执行每个测 试用例。运行插桩后的中断驱动程序源文件,当预测的执行序列发生时,西米克斯的控制脚 本自动触发对应的中断向量号,如果该中断能够真实触发,则将该执行序列、测试用例、真 实发生与否的信息,作为一行数据,打印到验证结果文件中。
[0155] 步骤84:西米克斯中输入所有的测试用例,在自然执行状态下依次执行每个测试 用例。运行插桩后的中断驱动程序源文件,当预测的执行序列即将发生偏离时,通过西米克 斯的插值方式强制将偏离的分支更正成与预测的执行序列相吻合的方向,如果在需要触发 中断时能够真实触发对应的中断,则将该执行序列、测试用例、真实发生与否的信息,作为 一行数据,打印到验证结果文件中。
[0156] 步骤9 :对验证后的验证结果进行严重性排序。具体过程如下:
[0157] 步骤91 :读取验证结果文件,合并执行序列相同的验证结果,每个验证结果增加 "发生次数"这一列,以统计相同的执行序列发生的次数。
[0158] 步骤92 :针对每个验证结果的真实发生与否这一属性,按照有真实发生在前,非 真实发生在后的顺序,进行一次排序。
[0159] 步骤93 :针对每个验证结果的的发生次数这一属性,按照发生次数由大到小的顺 序,对前述排序进行微调。
[0160] 步骤94:将最终的排序结果输入到测试结果文件中,从而得到了对受测试的中断 驱动程序源文件的竞争检测结果。
[0161] 最后应当说明的是:以上步骤仅用于说明本发明的技术方案而非对其限制。尽管 上述步骤对本发明进行了详细的说明,相关领域的技术人员应当理解,依然可以对本发明 的具体技术进行修改或者对部分技术进行等同替换;而不脱离本发明技术方案的精神,其 均应涵盖在本发明请求保护的技术方案范围当中。
【权利要求】
1. 一种动静态结合的中断驱动程序数据竞争检测方法,其特征在于该方法包含的步骤 为: 步骤1 :用户指定受测试的中断驱动程序源文件,所述的中断驱动程序源文件包含若 干个函数构成的主任务的源代码,以及该任务涉及到的中断所对应的中断处理程序的源代 码; 步骤2 :用户指定测试的配置文件,所述配置文件是XML文件,XML的全称是可扩展标记 语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源 语言;所述的测试配置文件包括主函数的入口说明、各个中断处理程序的中断向量号和中 断优先级; 步骤3 :对受测试的中断驱动程序源文件进行共享资源检测,得到共享资源列表; 步骤4 :对受测试的中断驱动程序源文件进行中断操作行为检测,得到中断操作列表; 步骤5 :对中断驱动程序源文件进行分析,得到简要控制流图RCFG, 步骤6 :将所有的RCFG互联起来,得到全局的中断互联控制流图IICFG ; 步骤7 :对IICFG进行深度优先遍历,得到中断驱动源程序的静态分析结果; 步骤8 :在西米克斯Simics仿真平台中执行中断驱动程序源文件,验证PR中的所有静 态分析结果, 步骤9 :对验证后的验证结果进行严重性排序,从而得到了对受测试的中断驱动程序 源文件的竞争检测结果。
2. 如权利要求1所述的动静态结合的中断驱动程序数据竞争检测方法,其特征在于所 述步骤3具体过程如下: 步骤31 :设置共享资源列表,将该表初始化为空,所述的共享资源列表包含五个属性, 分别是共享资源所在的函数名、该共享资源所在该函数中的行号、共享资源在该函数中的 别名、该共享资源的全局的实质名称、该共享资源的读写访问类型; 步骤32 :打开中断驱动程序源文件,逐行读取源文件数据,每当读入源文件的一行数 据时,通过语法分析该行数据中所包含的语句是否属于共享资源声明语句;所述的共享资 源包括:可全局被访问的共享变量、可共享访问的端口号、寄存器地址、可全局被访问的文 件句柄,以及上述所有的共享资源的有效的指针形式传播;如果该语句是共享资源声明语 句,则将该语句中包含的共享资源的具体信息作为共享资源列表的一行,添入到共享资源 列表中;共享资源的具体信息包括共享资源所在的函数名、该共享资源所在该函数中的行 号、共享资源在该函数中的别名、该共享资源的全局的实质名称、该共享资源的读写访问类 型。
3. 如权利要求1所述的动静态结合的中断驱动程序数据竞争检测方法,其特征在于所 述步骤4具体过程如下: 步骤41 :读取用户指定测试的配置文件,读入本次测试的函数主入口信息、各个中断 处理程序的中断向量号、中断优先级, 步骤42 :设置中断操作列表,将该表初始化为空;所述的中断操作列表包含四个属性, 分别是中断操作所在的函数名、该中断操作所在该函数中的行号、该中断的向量号、该中断 操作的操作类型; 步骤43 :打开中断驱动程序源文件,逐行读取源文件数据,每当读入源文件的一行数 据时,通过语法分析判断该行数据中包含的语句是否是中断控制语句,如果是,将该中断操 作添入到中断操作列表中。
4. 如权利要求1所述的动静态结合的中断驱动程序数据竞争检测方法,其特征在于所 述步骤5具体过程如下: 步骤51 :使用编译器LLVM对源程序进行分析,得到每个函数和中断处理程序的控制流 图 CFG ; 步骤52 :读取所有CFG,对每个CFG,依次读取其包含的每个结点; 步骤53:对于CFG中的每个结点,根据前述得到的共享资源列表和中断操作列表,判断 该结点是否包含有会影响共享资源的操作,即是否属于共享资源操作、中断开关操作、条件 分支判断操作;如果是,则将当前结点从当前CFG中删除,如果否,则什么都不做,判断完当 前结点后,继续往下判断下一个结点; 步骤54 :每遍历完成一个CFG,则得到了该CFG对应的RCFG。
5. 如权利要求1所述的动静态结合的中断驱动程序数据竞争检测方法,其特征在于所 述步骤6的具体过程如下: 步骤61 :设置一个变量INTB,将INTB初始化为0,所述INTB是用来记录当前中断的开 关情况, 步骤62 :读取所有RCFG,对每个RCFG,进行深度优先遍历, 所述深度优先遍历,是图的最普遍的搜索算法中的一种,它可以沿着树的深度依次遍 历树的每个结点,尽可能深地探索到树的各个分支, 步骤63 :对于遍历到的每个结点,如果其中的语句包含函数调用操作,转到步骤64 ;如 果其中的语句包含对共享变量的操作,转到步骤65;如果其中的语句包含中断开关操作, 转到步骤66,否则,则什么都不做,回到步骤63继续往下遍历, 步骤64 :将进行函数调用的结点的指针指向当前被调用函数的RCFG的入口结点,回到 步骤63继续往下遍历, 步骤65 :根据共享资源列表,找到可能会对当前语句所包含的共享资源进行操作的中 断,考察INTB中该中断状态是否为开,如果是,则将该中断处理程序的入口结点指向本结 点,回到步骤63继续往下遍历, 步骤66 :根据该中断开关操作的情况,更新INTB,回到步骤63继续往下遍历。
6. 如权利要求1所述的动静态结合的中断驱动程序数据竞争检测方法,其特征在于所 述步骤7的具体过程如下: 步骤71 :从IICFG的主函数入口结点开始,对IICFG进行深度优先遍历, 步骤72 :生成执行序列记录表RQ,将RQ初始化为空,生成静态预测结果PR,将PR初始 化为空,RQ用来记录深度优先遍历过程中的执行序列,PR用来记录遍历过程中发现的竞争 关系, 步骤73 :在深度优先遍历过程中,每往下遍历一个结点,则将当前结点压入RQ ;每往后 回退一个结点,将当前结点退出RQ, 步骤74 :对每个结点,考察它是否包含共享资源操作语句,如果是,转到步骤75,如果 否,则回到步骤74继续往下遍历, 步骤75 :考察所有指向当前结点的函数中,其优先级是否比当前结点所属的函数的优 先级高;如果是,转到76,如果否,则回到步骤74继续往下遍历, 步骤76 :将当前操作的共享资源信息和RQ中的执行序列联接,构成一条竞争关系的预 测结果,添加到PR中,回到步骤74继续往下遍历。
7. 如权利要求1所述的动静态结合的中断驱动程序数据竞争检测方法,其特征在于所 述步骤8的具体过程如下: 步骤81 :打开中断驱动程序源文件,根据已有的共享资源列表,对源文件插桩,将源文 件中的每个共享资源访问位置设置成西米克斯的读写断点,并将每个读写断点都绑定到 西米克斯的访问控制回调函数中, 步骤82 :将静态的预测分析结果转换成西米克斯的访问控制回调函数的执行控制脚 本, 步骤83:在西米克斯中输入所有的测试用例,在自然执行状态下依次执行每个测试用 例,运行插桩后的中断驱动程序源文件,当预测的执行序列发生时,西米克斯的控制脚本自 动触发对应的中断向量号,如果该中断能够真实触发,则将该执行序列、测试用例、真实发 生与否的信息,作为一行数据,打印到验证结果文件中, 步骤84:西米克斯中输入所有的测试用例,在自然执行状态下依次执行每个测试用 例,运行插桩后的中断驱动程序源文件,当预测的执行序列即将发生偏离时,通过西米克斯 的插值方式强制将偏离的分支更正成与预测的执行序列相吻合的方向,如果在需要触发中 断时能够真实触发对应的中断,则将该执行序列、测试用例、真实发生与否的信息,作为一 行数据,打印到验证结果文件中。
8. 如权利要求1所述的动静态结合的中断驱动程序数据竞争检测方法,其特征在于所 述步骤9具体过程如下: 步骤91 :读取验证结果文件,合并执行序列相同的验证结果,每个验证结果增加"发生 次数"这一列,以统计相同的执行序列发生的次数, 步骤92 :针对每个验证结果的真实发生与否这一属性,按照有真实发生在前,非真实 发生在后的顺序,进行一次排序, 步骤93:针对每个验证结果的的发生次数这一属性,按照发生次数由大到小的顺序, 对前述排序进行微调, 步骤94:将最终的排序结果输入到测试结果文件中,从而得到了对受测试的中断驱动 程序源文件的竞争检测结果。
【文档编号】G06F9/445GK104090798SQ201410324303
【公开日】2014年10月8日 申请日期:2014年7月8日 优先权日:2014年7月8日
【发明者】王林章, 陈园军, 陈志 , 李宣东 申请人:南京大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1