法律状态公告日
法律状态信息
法律状态
2012-09-05
未缴年费专利权终止 IPC(主分类):G11C29/12 授权公告日:20090318 终止日期:20110630 申请日:20060630
专利权的终止
2009-03-18
授权
授权
2007-03-28
实质审查的生效
实质审查的生效
2007-01-31
公开
公开
技术领域
本发明涉及嵌入式系统动态存储度技术领域,尤其是涉及一种嵌入式系统动态存储错误静态检测的实现方法。
背景技术
嵌入式系统中,单任务操作系统内存被分成两部分,一部分给了操作系统的驻留程序,另一部分则分给了用户进程。而在多任务操作系统中,后一部分需要继续细分给不同的进程。这个工作是由操作系统的内存管理机制实现的。一个操作系统的内存管理效率对它的性能有着很重要的影响。一般而言,希望内存在通过有效的分配之后能够容纳更多的任务以提高CPU的利用率。
一般而言,内存管理需要完成以下功能:二次定址、保护、共享、逻辑组织和物理组织。首先,进程调入调出内存存在随机性,我们需要内存管理提供二次定址功能使得任务。再次调入内存能够和先前一样正常运行。其次,不同的进程为了自己的正常运行需要有自己的私有空间,内存管理需要提供相应的保护机制以容许这种私有空间的存在。再次,为了能够协同完成更高级的功能,不同进程之间需要有不同形式的交互,比如说访问对方数据,使用对方进程代码等等,而内存管理所完成的共享功能可以保证顺利实现。
另外,由于计算机采用的是线性存储设备,而计算机程序本身为了完成自身的逻辑任务就有了适合自己特点的逻辑划分,如果操作系统或计算机硬件能够顺利实现这个逻辑划分和线性存储之间的顺利转换对程序本身实现的相对独立性等方面不无裨益。因此内存管理需要提供相应的逻辑组织功能。
许多重要的程序设计语言使用指针支持动态存储管理。指针操作提高了语言的表现能力,增加了语言灵活性,同时也会产生大量动态存储错误。例如脱引用空指针,修改只读存储空间,引用未定义或已释放的存储空间,存储泄漏等。这些错误难以在程序调试阶段检测和定位,原因是:
(1)可能在程序多次执行中才会出现一次;
(2)其危害的显现需要运行相当长的时期;
(3)不同的平台下程序有不同的行为,使其不易显现;
(4)程序中大量的存储分配和释放操作以及复杂控制流程使错误不易定位。动态存储错误会造成程序执行结果错误,执行速度降低,甚至程序崩溃。
因此需要对动态存储错误进行检测,以便进行有效的错误检测、定位和处理,提高系统的效率。
发明内容
本发明的目的在于克服现有技术中的不足,提供一种嵌入式系统动态存储错误静态检测的实现方法。
本发明解决其技术问题采用的技术方案如下:
本发明提供了一种嵌入式系统动态存储错误静态检测的实现方法,包括以下步骤:
(1)使用指针树对控制流信息进行记录;
所述的指针树是一棵记录程序动态使用存储空间状况的多叉树,由两种节点构成:入口结点和存储节点;入口节点是指针树的根结点,是访问存储节点的入口;存储节点是指针树的叶子结点,每一个存储节点与程序动态分配的一块存储空间对应;
(2)使用指针树对过程内动态存储错误进行检测:
①当某个过程语法分析开始时,构造此过程对应指针树的入口节点E和临时存储节点T;
②在语法分析过程中,使用临时存储节点记录节点T当前控制流位置;
③当语法分析识别出一个存储分配语句,为分配语句中的地址指针PI新建相应的存储节点S,将节点T的控制流位置拷贝给节点S,并记录地址指针PI是否指向数组空间,并判断是否存在内存泄漏,如果有对此给出警告;
④当分析过程识别出存储释放语句,将其分解,根据分解结果在指针树上查找对应节点N,如果和地址指针PI中有且仅有一个与数组空间对应,对此给出警告;比较节点N和节点T记录的控制流位置,如果找不到节点N或者由于判断值返回为真而无法删除该节点,说明该释放操作失败,对此给出警告;
⑤该过程语法分析结束后,对其指针树进行分析;每个不连通的存储节点代表失去索引的存储空间,其他存储节点代表在过程内未被释放的动态存储空间,对这些存储节点给出警告。
作为本发明的一种改进,所述使用指针树对控制流信息进行记录是通过以下方式实现的:
在存储节点记录其对应存储空间被分配时在控制流中所处的位置,使用如下的简单形式表示该位:在过程内,称作用域包含某语句的所有分支和循环的总数为该语句的控制流深度,对于控制流深度为1的存储分配语句,使用其所在的分支或循环的名字及分支或循环所在的行号的组合记录此控制流,并将该组合称为控制流标记。
本发明与背景技术相比,具有的有益的效果是:
嵌入式系统动态存储错误静态检测的实现方法中,指针树检测法使用存储节点表示程序动态分配的存储空间,并记录程序分配和释放存储空间时的控制流位置;利用指针树上增删节点的操作,模拟程序动态的存储分配和释放操作。指针树的状态反映了程序当前使用动态存储空间的状况。
(1)精确性。本发明通过定义指针树,能够精确的判断出在程序编译过程中,是否出现了内存的泄漏等问题,如果出现了,能够通过语法树进行精确的定位。
(2)可靠性。本发明通过指针树对程序编译过程进行分析,覆盖了程序编译的整个过程,能够可靠全面的进行动态存储的检测。
附图说明
附图1是本发明指针树检测方法示意图。
具体实施方法
下面结合附图和实施例对本发明作进一步的说明。
一种嵌入式系统动态存储错误静态检测的实现方法,其具体实施方式为:
1)嵌入式系统程序编译中,对于指针树的定义:
指针树是一棵记录程序动态使用存储空间状况的多叉树,由两种节点构成:入口结点和存储节点,入口节点是指针树的根结点,是访问存储节点的入口,存储节点是指针树的叶子结点,每一个存储节点与程序动态分配的一块存储空间对应;
指针树中,对于控制流信息的记录:
存储节点记录了其对应存储空间被分配时在控制流中所处的位置,使用如下的简单形式表示该位,在过程内,称作用域包含某语句的所有分支和循环的总数为该语句的控制流深度,对于控制流深度为1的存储分配语句,使用其所在的分支或循环的名字及分支或循环所在的行号的组合记录此控制流,并将该组合称为控制流标记。
例如:某存储分配语句处于第8行开始的while循环中,则相应的控制流标记为while_8。对于控制流深度大于1的存储分配操作,使用*标记将各个深度的控制流标记自外向内连接起来记录控制流位置,*代表控制流进入更深一层的流程。同一指针可能在控制流的不同分支中多次分配存储空间,*标记用于将这些控制流位置连接。
指针树利用存储节点间的父子关系反映指针作用域的嵌套关系。
在嵌入式系统常见动态存储错误以及原因如下:
a)指向对象数组空间的指针未使用Delete[]进行释放,造成除第一个数组元素外的析构函数未能调用,产生存储问题。
b)空间释放顺序错误产生存储错误。
c)对同一指针多次分配存储空间,或对已经分配空间的指针赋值,使最初分配的空间失去索引,产生内存泄漏。
d)程序中存在的复杂控制流程造成的存储问题。
以上动态存储错误产生的原因多种多样,但其本质可以归结为存储空间的分配与释放不匹配。这种不匹配在程序中体现为:
·对象数组的指针未使用Delete[]进行释放,造成除数组第一个元素外的析构函数未能调用;
·指针和作用域嵌套在该指针所指向结构内的指针分配;
·空间和释放空间顺序不匹配;
·指针赋值语句造成的存储泄漏;
·程序复杂的控制流程造成的分配和释放不匹配。
2)使用指针树检测过程内动态存储错误的方法
指针树可以检测1)中提到的a、b、c、d四种典型的过程内动态存储错误。指针树是在语法分析过程中动态建立和使用的。最初只有一个入口节点,随着语法分析过程识别出存储分配和释放操作,在指针树上相应地增删节点。
利用指针树检测动态存储错误需要使用detach(pt)和compare(a,b)两个辅助函数,参数pt为指针名,a和b是存储节点。函数detach(pt)用于将作用域嵌套的指针分解。例如base->c指针名经detach(pt)分解后,形成base和c两个指针名。函数compare(a,b)根据存储节点a和b的控制流位置分析a和b对应的存储空间能否在程序一次执行中都被分配。函数compare(a,b)″)返回值为真,当且仅当a和b对应的分配空间操作处于控制流的不同分支并且这两个分支不在同一个循环中出现。
①当某个过程语法分析开始时,构造此过程对应指针树的入口节点E和临时存储节点T,T的各个域均为空。
②在语法分析过程中,使用临时存储节点记录T当前控制流位置。
③当语法分析识别出一个存储分配语句,为分配语句中的地址指针PI新建相应的存储节点S,将T的控制流位置拷贝给S,并记录PI是否指向数组空间,利用detach(pt)函数将PI分解,根据分解结果在指针树上找到S应插入的位置,插入节点S。如果该位置已有节点N,使用compare(a,b)函数比较节点N和节点S的控制流位置,如果compare函数返回为真,用*标记将S记录的控制流位置连接在N的控制流之后。如果返回为假,说明可能在程序一次执行中,对PI连续分配两次空间而没有将第一次分配的空间释放,造成内存泄漏,对此给出警告并判断是否存在内存泄漏。
④当分析过程识别出存储释放语句delete PI或者delete[]PI,利用detach(pt)将其分解。根据分解结果在指针树上查找对应节点N,如果N和指针PI中有且仅有一个与数组空间对应,对此给出警告。利用compare(a,b)比较临时节点T和节点N记录的控制流位置,在compare返回为假的情况下,如果N控制流不包含*标记,删除节点N;如果包含*则删除N中使compare(a,b)为假的控制流部分。如果找不到节点N或者由于compare返回为真而无法删除该节点,说明该释放操作失败,对此给出警告。
⑤该过程语法分析结束后,对其指针树进行分析;每个不连通的存储节点代表失去索引的存储空间,其他存储节点代表在过程内未被释放的动态存储空间,对这些存储节点给出警告。
机译: 使用存储器管理单元执行动态存储器管理的嵌入式系统及其存储器管理方法
机译: 用于将敏感数据安全地存储在嵌入式微芯片系统(特别是智能卡)的存储器中的方法以及实现该方法的嵌入式系统
机译: 在嵌入式系统中实现虚拟动态库加载的方法和装置