一种新型操作系统资源问题检测方法

文档序号:6505726阅读:141来源:国知局
一种新型操作系统资源问题检测方法
【专利摘要】本发明公开了一种新型操作系统资源问题检测方法,属于软件测试【技术领域】。本发明第一步是文件读取。第二步是语句预处理。第三步是语句处理。第四步是路径生成。第五步是检测并报告检测结果:通过遍历路径链表中的路径,监视个路径中资源的数量变化情况。根据资源问题错误模型检测可能存在的资源问题。记录检测出的资源问题的种类、发生位置以信息,并生成检测结果报告。记录从入口到发生资源问题的代码处的执行路径与控制条件,生成辅助测试用例。本步骤通过遍历资源路径,记录路径中各资源数量的变化情况,来判断函数中是否存在资源问题。
【专利说明】一种新型操作系统资源问题检测方法
【技术领域】
[0001]本发明涉及一种新型操作系统资源问题检测方法,属于软件测试【技术领域】。
【背景技术】
[0002]资源申请、使用、释放过程中,因未满足规范性、安全性、可靠性要求而引发的错误称为资源问题,常见的资源问题包括资源泄漏和资源访问冲突两种情况。资源问题是一种常见的软件缺陷,具有隐蔽性强、危害性强、随机性强、影响广泛等特点。资源问题的严重性引起了不少学者的关注,但大部分学者的关注对象局限在内存资源,未考虑内核锁、套接字等其他资源;同时,仅解决了内存资源的泄漏的检测,未解决资源访问冲突问题的检测。他们提出的内存资源泄漏问题的检测方法主要包括静态分析方法和动态分析方法两种。静态分析方法多采用模型检验,即首先建立内存管理模型,然后通过对模型的分析来完成软件系统内存泄漏问题的检测。这种方法在大型系统错误检测方面比测试要有效,但检测是基于代码抽象出的模型,而不是代码本身;在模型建立过程中使用的抽象技术以及转化方法,都可能使所建模型与程序代码存在较大偏差,进而影响监测结果的可靠性。动态分析技术主要存在两个缺陷:由于受到测试用例的质量和数量的限制,无法较全面检测程序中的内存泄露问题;另外,由于受到操作系统自身特点的限制,很难将动态分析技术用于操作系统内核的检测。
[0003]操作系统是管理和控制计算机硬件与软件资源的计算机程序,是用户和计算机的接口,同时也是计算机硬件和其他软件的接口。操作系统软件具有功能复杂、可靠性和安全性要求高等特点。因而资源问题对操作系统的危害巨大。为了解决操作系统软件中的资源问题的检测问题,提出了本发明。

【发明内容】

[0004]本发明针对以上问题的提出,而研制一种新型操作系统资源问题检测方法。
[0005]本发明的技术方案如下:
[0006]第一步是文件读取:负责读取指定的源代码文件,找出文件中的各个函数,并将函数所在文件名称、函数名称、函数代码信息实例化到函数信息类变量中,存入函数链表。本步骤用于源代码分解,将源代码文件中的有效代码分解成一个个函数,并记录函数的基本信息,供后续处理使用。
[0007]第二步是语句预处理:进行语句标准化处理,确保每行只包含一条语句;为结尾无“return”关键字的函数加上return语句,以便后期检测中找到该出口 ;将break语句转换成goto语句,并删除向上返回的goto语句及其标签语句,以防止资源路径图中出现“环”;对函数语句进行类型标示,并删除无关语句;记录语句的原始行号、语句类型、语句内容以及资源处理信息,并保存到待处理语句链表中。本步骤用于完成语句精简,根据检测需要,将各个函数中的无关语句删除,从而减少检测工作量,增加检测效率。
[0008]第三步是语句处理:根据语句类型对待处理语句链表中的语句进行处理,生成相应语句节点和路径元,分别存入语句节点链表和路径元链表。本步骤用于得到函数中与资源操作相关的语句信息和路径信息。
[0009]第四步是路径生成:根据路径元链表中的路径元,生成从入口节点到所有出口节点的全部路径,并将路径存储在路径链表中。一个用路径元链表表示的资源路径图可以转换为一个有重复节点的路径树。路径树从根节点到各叶子节点的路径就构成了资源路径图的全部资源路径,如图2所示。本步骤用于得到函数中全部资源路径。
[0010]第五步是检测并报告检测结果:通过遍历路径链表中的路径,监视个路径中资源的数量变化情况。根据资源问题错误模型检测可能存在的资源问题。记录检测出的资源问题的种类、发生位置以信息,并生成检测结果报告。记录从入口到发生资源问题的代码处的执行路径与控制条件,生成辅助测试用例。本步骤通过遍历资源路径,记录路径中各资源数量的变化情况,来判断函数中是否存在资源问题。
[0011]资源的使用要遵循以下准则:资源使用前需先申请;不再使用的资源应及时释放并且只能释放一次。不满足上述准则时,就会出现资源问题,问题主要包括资源泄漏和资源访问冲突两种类型,其中资源泄漏又包含资源失控和资源遗漏两种情况。当一个资源未被释放但已不可访问时,称之为资源失控。资源遗漏是指因未释放不再使用的资源导致的资源泄漏问题。资源访问冲突是指访问已经被释放的资源,导致程序出现不可预见的结果。比如再次释放已被释放的资源,导致程序崩溃;访问已经被释放的指针,造成程序执行结果不可预知等。对一个函数Fi,删除与资源操作无关的语句,将入口语句、资源相关语句、出口语句视为一个个节点,通过路径相关语句组成的控制流将各个节点连接起来,就构成了该函数的资源路径图。该图有唯一一个入度为O的点,称之为入口节点;图中出度为O的点称为出口节点。假设Fi的资源路径图ResGraphFi有m个出口节点NodeEx[0] ,NodeEx[I]、....、NodeEx[m-l]。从入口节点到每个出口节点的执行路径构成了 Fi的全部资源路径。通过遍历各条资源路径,根据资源问题错误模型监测各个路径上资源的状态与数量,即可检测出该函数是否存在资源相关问题。如果某左资源赋值语句所在节点处,该资源的数量不为0,则该资源失控,存在资源泄露。如果在某个出口节点处,某资源的数量减去作为函数返回值的资源数量>0,则该资源未被及时释放,存在资源泄漏;某资源的数量减去作为函数返回值的资源数量〈0,则该资源被多次释放,存在资源访问冲突。在某资源使用语句处,如果该资源的数量为0,则存在资源未被重新申请即使用的情况,存在资源访问错误。
[0012]本发明原理及有益效果:本发明涉及的检测方案解决了检测效率、资源扩展、漏报及误报、问题确认等几个方面的问题。方案可以检测软件代码中的资源泄漏、资源访问冲突等常见资源问题;同时,可以根据自身需求,创建自定义资源并将其纳入检测范围,使得检测对象不局限于内存资源,也可检测内核锁、套接字等其他资源。方案采用全路径覆盖检测,加之建立了较完备的资源问题错误模型,因而具有较低的漏报率,在检测过程中,考虑了待测程序的上下文环境,降低了误报率;为了从静态分析的结果中识别出真实的缺陷,需要设计测试用例以确认所报错误的真实性;该方案完整记录了疑似错误代码的位置及到达该位置的执行路径和执行条件,可以半自动完成这些测试用例的生成工作。本发明解决了操作系统软件中资源问题的自动化检测问题,提高了测试效率,降低了测试成本。
【专利附图】

【附图说明】[0013]图1是资源问题检测过程的流程图,用于描述整个检测流程;
[0014]图2是由路径元链表生产路径链表的示意图。
[0015]图3if_else语句的标示结果。
【具体实施方式】
[0016]具体检测过程分以下五步完成,如图1所示。
[0017]第一步是文件读取:负责读取指定的源代码文件,找出文件中的各个函数,并将函数所在文件名称、函数名称、函数代码信息实例化到函数信息类变量中,存入函数链表。
[0018]第二步是语句预处理:进行语句标准化处理,确保每行只包含一条语句;为结尾无“return”关键字的函数加上return语句,以便后期检测中找到该出口 J break语句转换成goto语句,并删除向上返回的goto语句及其标签语句,以防止资源路径图中出现“环”;对函数语句进行类型标示,并删除无关语句;记录语句的原始行号、语句类型、语句内容以及资源处理信息,并保存到待处理语句链表中。
[0019]第三步是语句处理:根据语句类型对待处理语句链表中的语句进行处理,生成相应语句节点和路径元,分别存入语句节点链表和路径元链表。
[0020]第四步是路径生成:根据路径元链表中的路径元,生成从入口节点到所有出口节点的全部路径,并将路径存储在路径链表中。一个用路径元链表表示的资源路径图可以转换为一个有重复节点的路径树。路径树从根节点到各叶子节点的路径就构成了资源路径图的全部资源路径,如图2所示。
[0021]第五步是检测并报告检测结果:通过遍历路径链表中的路径,监视个路径中资源的数量变化情况。根据资源问题错误模型检测可能存在的资源问题。记录检测出的资源问题的种类、发生位置以等信息,并生成检测结果报告。记录从入口到发生资源问题的代码处的执行路径与控制条件,生成辅助测试用例。
[0022]本发明所述的资源问题检测方案,包括文件读取、预处理、语句处理、路径生成、生成检测报告等步骤,方案的具体实施过程如下。
[0023](I)文件读取:打开并读取用户指定程序源文件,并对读取的文件内容进行处理,形成以函数为单位的存储单元,存放在函数链表中,供后续处理使用。
[0024]首先应删除所有注释行。根据C和C++语言的特定,确定一条语句为函数定义开始的条件如下:该语句不含“;”、不含“if”、不含“switch”、不含和“}”、不含“for”、不含“whi Ie ”、不含“ do ”、不含“#”、不含“:”、不含“=”、不以“”开头、不以“”开头、不以“//”开头,不以“\”结尾。
[0025]然后从文件中逐行查看是否为函数定义行。如果是,则将函数名称、函数体等信息存入函数链表中。
[0026](2)预处理:在函数体中,找出与资源问题检测相关的入口语句、出口语句、资源相关语句及路径相关语句等,并将找出的 语句存储于待处理语句链表,供后续处理使用。主要完成以下工作。
[0027]语句分解:若一行中存在多条语句,则将这些语句分解成独立行,以方便后续处理。
[0028]处理大括号:将语句中出现的和分离出来,独立成一行。[0029]判断语句处理:若一行中存“else”关键词紧跟在“if”关键词之后的情况时,将该if语句分离出来,独立成行。
[0030]返回语句处理:为结尾无“return”关键字的函数加上return语句,以便后期检测中找到该出口。
[0031]将break语句转换成goto语句:为了统一处理,将break语句转换成goto语句。
[0032]消除向上返回的goto的语句:删除向上返回的goto语句。
[0033]语句类型标示:对函数的每条语句进行类型标示。无关语句的标示是语句类型标示的难点。无关语句的标示需要对代码进行多次扫描,第一次扫描单条语句,以后扫描if、if-else和switch_case中的复合语句。无关语句的标示基于以下准则:①除资源相关语句、路径相关语句、入口语句和出口语句外的其他语句均为无关语句。此类无关语句,在第一次遍历时标示。②第一个资源相关语句前的所有语句(含路径相关语句)均视为无关语句。此类无关语句,在第一次遍历时标示。③子语句全部为无关语句的复合语句(含路径相关语句块)视为无关语句。此类无关语句,在后续遍历时标示。对if、if-else和switch-case中的复合语句是否为无关语句的处理过程如下。
[0034]if 语句的标准形式是“if (expression) statement”,这里的 statement 可能是单条语句,也可能是由大括号括起来的复合语句块。对一个if语句来说,如果if后的statement中的所有语句均不含资源相关语句和出口语句,将该if语句标示为无关语句;否则视情将该if语句标示为路径相关语句、资源申请成功语句或资源申请失效语句。
[0035]if-else 语句的标准形式是 “ if (expression) statementA eIsestatementB对于一个if-else语句来说,若statementA、statementB的所有语句均不含资源相关语句或出口语句,则将该if语句和else语句均标示为无关语句;若statementA包含资源相关语句或出口语句,statementB不包含资源相关语句或出口语句,则将该if语句标示为路径相关语句、资源申请成功语句或资源申请失效语句,将else语句均标示为无关语句;若statementB包含资源相关语句或出口语句,statementA不包含资源相关语句或出口语句,则将该if语句标示为路径相关语句、资源申请成功语句或资源申请失效语句,将else语句均标示为无关语句(这样做的目的是为了方便后续处理);若statementA、statementB均包含资源相关语句或出口语句,则将该if语句和else语句均标示为无关语句;若if和else语句后的语句或复合语句块中的所有语句均不含资源相关语句和出口语句,则将该语句的if语句标示为路径相关语句、资源申请成功语句或资源申请失效语句,将else语句均标示为路径相关语句。假设用O表示语句中不包含资源相关语句或出口语句,用I表示语句中包含资源相关语句或出口语句,用A表示无关语句,用B表示路径相关语句、资源申请成功语句或资源申请失效语句,则一个标准的if-else语句的标示结果如图3所示。
[0036]基于上述分析,对if语句是否为无关语句的标示过程如下:如果statement中不包含未被标示的if语句,贝1J按照statement中是否包含资源相关语句或出口语句以及if语句本身是否包含资源申请成功或失效条件,完成if语句的标示;如果statement中包含未被标示if语句,则递归调用if语句的处理函数完成语句类型标示。对if-else语句是否为无关语句的标示过程如下:statementA和statementB中不包含未被标示if语句,贝1J按照表I的标示规则对if和else语句进行标示;如果statementA或statementB中包含未被标示if语句,贝1J递归处理包含if语句的statement。if和if-else语句的处理流程如图3所示。
[0037]对于一个switch-case 语句来说,当某个 case/default 至 break(或下一个 case)之间的语句均不含资源相关语句和出口语句时,将该case/default语句块标示为无关语句,goto语句也标示为无关语句。当一个switch—case语句中的所有case语句均为无关语句时,将该switch语句块标示为无关语句。
[0038]为了完成对if-else和switch-case语句嵌套情况下的处理,需要对待处理语句进行两遍if-else语句处理扫描和两遍switch-case语句处理扫描,四次扫描交叉进行,如if-else 处理—switch-case 处理—if-else 处理—switch-case 处理,或者 switch-case处理—if-else 处理—switch-case 处理—if-else 处理。
[0039]删除无关语句:遍历待处理语句链表,删除所有类型为无关语句的语句。
[0040](3)语句处理:预处理模块完成后,待处理语句链表中存放的是与资源问题相关的资源相关语句、路径相关语句、出口语句、入口语句等有效语句,语句处理模块根据这些有效语句生成语句结点,存储于语句结点链表;同时生成相通结点间的路径元,存储于路径元链表,供路径生成模块使用。if-else语句的处理是语句处理的难点,具体处理过程如下。
[0041]在对if-else进行处理时,如果else表达式不存在,则要生成该表达式的根结点(if表达式)到各子结点的路径元,同时还要生成各子结点到下一结点的路径元;当else表达式不存在时,要生成该表达式的根据点到子结点的路径元,还要根节点和子结点到下一结点的路径元。因而对于一个if表达式来说,需将根节点和非出口节点的子结点存入判定路径元起始结点链表,以便生成他们与后续语句的路径元。对于一个if-else表达式来说,则需将非出口节点的子结点存入判定路径元起始结点链表,以便生成他们与后续语句的路径元。
[0042]遇到if语句首先生成语句结点,存入语句结点链表,并生成判定语句根结点信息结构体,存入判定语句根节点栈。
[0043]if语句后的语句有三种情况:新的if语句、单行非if语句、由大括号括起来的复合语句。
[0044]对于if语句,采用递归调用来处理。
[0045]单行非if语句做如下处理:若为switch-case语句则按switch-case语句处理,否则按如下方式处理:生成节点,存入数组,若该语句非出口语句则将节点位置记录在判定路径元起始结点链表,以便生成后续路径段;若后续行含else则按else语句继续处理后续语句,否则将栈顶元素的iPos存入临时节点数组并做出栈操作。
[0046]复合语句做如下处理:当复合语句不包含if语句时,处理方式如下:最后一条语句的处理方式同单行语句;其他语句则采用生成节点、存入数组、记录路径段的方式处理。当复合语句包含if语句时,通过递归调用本处理过程完成处理。
[0047]当条件表达式中包含资源申请失效条件时,资源未申请成功,因而此时在if后面的语句中,要自动加入针对该资源的资源释放语句。
[0048]else语句的处理过程如下:elSe语句后的语句有三种情况,即新的if语句、单行非if语句、由大括号括起来的复合语句。
[0049]对于if语句,按照if语句处理方式处理。
[0050]单行语句做如下处理:若为switch-case语句则按switch-case语句处理,否则按如下方式处理:生成节点,存入数组,若该语句非出口语句则将节点位置记录在临时节点数组,以便生成后续路径段;做出栈操作。
[0051]复合语句做如下处理:当复合语句不包含if语句时,处理方式如下:最后一条语句的处理方式同单行语句;其他语句则采用生成节点、存入数组、记录路径段的方式处理。当复合语句包含if语句时,通过递归调用本处理过程完成处理。
[0052]当条件表达式中包含资源申请成功条件时,与之对应的else语句被执行时,表示资源申请失败,因而此时在else后面的语句中,要自动加入针对该资源的资源释放语句。
[0053](4)路径生成:路径生成模块根据语句处理模块生成的语句结点链表和路径元链表,找到资源路径图中从源点到各个汇点的全部路径,并将其保存到路径链表中。处理过程如下。
[0054]一个采用路径元标示的资源路径图可以转换为一个有重复节点的路径树。转换方法是对于任意路径元P (i,j),路径元终止节点j是路径元起始节点i的孩子。路径树的所有从根节点到叶子节点的路径构成了资源路径图的全部资源路径。
[0055]从资源路径图的路径元数组得到资源路径的算法如下。
[0056]算法1.资源路径图路径生成算法
[0057]输入:语句处理模块得到的路径元链表
[0058]输出:路径链表
[0059]处理过程:.[0060]stepl.初始化:当前父节点NodeF=_2 ;当前完整路径段PathS= “ ”;清空路径数组Paths ;
[0061]step2.处理以入口节点为起始结点的路径元:读取路径元链表PathUnit中的第一个路径兀PathUnit [O] ;a=PathUnit [O].1Begin ;在PathUnit中查找所有以a为起始结点的路径元,并将这些路径元记入路径数组Paths ;从PathUnit中删除已处理的路径元。
[0062]step3.处理PathUnit中的其他元素:对于Paths中的元素Pi,得到Pi的当前路径终点NodeEnd,在PathUnit中查找所有以a为起始结点的路径元。若找到,则分别将这些路径元的终止节点追加到NodeEnd后面,生成新的路径,将这些新路径存入路径数组Paths中;若未找到,则将Pi的处理完成标识设置为true。循环做以上处理,直至Paths中的所有路径的处理完成标示均为true。
[0063](5)生成检测报告:遍历路径链表中的每条路径,根据该路径中的资源处理情况,生成检测报告。
[0064]假设资源路径图的路径数组Paths中的任一路径Pi有节点Nodel、Node2、…Noden组成,顺序访问这些节点,并记录资源的数量。如果某左资源赋值语句所在节点处,该资源的数量不为0,则该资源失控,存在资源泄露(错误5)。如果在某个出口节点处,某资源的数量减去作为函数返回值的资源数量>0,则该资源未被及时释放,存在资源泄漏(错误3);某资源的数量减去作为函数返回值的资源数量〈0,则该资源被多次释放,存在资源访问冲突(错误4)。在某资源使用语句处,如果该资源的数量为0,则存在资源未被重新申请即使用的情况,存在资源访问错误(错误1、2)。若某资源的数量已经为零,又出现包含该资源的语句时,报告资源访问冲突错误。对于每一处错误,记录执行路径及执行条件等信息,并将这些信息一并记入检测报告中。[0065]以上所述,仅为本发明较佳的【具体实施方式】,但本发明的保护范围并不局限于此,任何熟悉本【技术领域】的技术人员在本发明揭露的技术范围内,根据本发明的技术方案及其发明构思加以等同替换或改变,都应涵盖在本发明的保护范围之内。
【权利要求】
1.一种新型操作系统资源问题检测方法,其特征在于:包括如下几步, 第一步是文件读取:负责读取指定的源代码文件,找出文件中的各个函数,并将函数所在文件名称、函数名称、函数代码信息实例化到函数信息类变量中,存入函数链表;本步骤用于源代码分解,将源代码文件中的有效代码分解成一个个函数,并记录函数的基本信息,供后续处理使用; 第二步是语句预处理:进行语句标准化处理,确保每行只包含一条语句;为结尾无“return”关键字的函数加上return语句,以便后期检测中找到该出口 ;将break语句转换成goto语句,并删除向上返回的goto语句及其标签语句,以防止资源路径图中出现“环”;对函数语句进行类型标示,并删除无关语句;记录语句的原始行号、语句类型、语句内容以及资源处理信息,并保存到待处理语句链表中;本步骤用于完成语句精简,根据检测需要,将各个函数中的无关语句删除,从而减少检测工作量,增加检测效率; 第三步是语句处理:根据语句类型对待处理语句链表中的语句进行处理,生成相应语句节点和路径元,分别存入语句节点链表和路径元链表;本步骤用于得到函数中与资源操作相关的语句信息和路径信息; 第四步是路径生成:根据路径元链表中的路径元,生成从入口节点到所有出口节点的全部路径,并将路径存储在路径链表中;一个用路径元链表表示的资源路径图可以转换为一个有重复节点的路径树;路径树从根节点到各叶子节点的路径就构成了资源路径图的全部资源路径;本步骤用于得到函数中全部资源路径; 第五步是检测并报告检测结果:通过遍历路径链表中的路径,监视个路径中资源的数量变化情况;根据资源问题错误模型检测可能存在的资源问题;记录检测出的资源问题的种类、发生位置以信息,并生成检测结果报告;记录从入口到发生资源问题的代码处的执行路径与控制条件,生成辅助测试用例;本步骤通过遍历资源路径,记录路径中各资源数量的变化情况,来判断函数中是否存在资源问题。
【文档编号】G06F11/36GK103440196SQ201310291124
【公开日】2013年12月11日 申请日期:2013年7月11日 优先权日:2013年7月11日
【发明者】黄明, 郭书杰, 梁旭 申请人:大连交通大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1