[发明专利]基于编译过程中间结果的静态堆栈检测方法无效
申请号: | 201010539860.4 | 申请日: | 2010-11-09 |
公开(公告)号: | CN102012833A | 公开(公告)日: | 2011-04-13 |
发明(设计)人: | 程胜;石文臣;张惠臻;孙磊 | 申请(专利权)人: | 北京神舟航天软件技术有限公司 |
主分类号: | G06F9/45 | 分类号: | G06F9/45 |
代理公司: | 北京北新智诚知识产权代理有限公司 11100 | 代理人: | 张卫华 |
地址: | 100094*** | 国省代码: | 北京;11 |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | |||
搜索关键词: | 基于 编译 过程 中间 结果 静态 堆栈 检测 方法 | ||
技术领域
本发明涉及一种基于编译过程中间结果的静态堆栈检测方法,属于编译器应用技术领域。
背景技术
C语言使用堆栈来存储局部变量和传递函数的参数,所以,如果函数的调用层数过多或者出现了递归调用,就非常容易使得堆栈上的内存需求超过了最大能够使用的空间限制,产生堆栈溢出。在普通的PC系统中,堆栈溢出并不是一个很明显的问题,一是因为很多系统中含有存储器管理单元(MMU),可以提供对堆栈内存空间的保护。二是因为普通PC系统存储器容量较大,可以分配给堆栈足够的内存空间,但是在内存容量受限制且大多不具备内存保护机制的嵌入式设备上,堆栈溢出经常会出现,而且一旦出现,往往意味着整个系统崩溃。所以在对嵌入式的C代码进行检查的时候,堆栈溢出检查是一个很重要的方面。
目前,在堆栈分析方面,还没有太多成熟的工具可用,唯一可以使用的是商用分析工具stackAnalyzer。这款软件可以自动分析出应用程序中最差情况下的堆栈使用情况;分析结果以标注的形式在调用关系图和控制流图中显示。它可以计算出任何一个函数的堆栈使用情况,并且起始点可以任意选取,也可以预报可能出现的堆栈溢出,以及优化对堆栈的使用。但是,这款软件是一个需要付费的商用产品,且价格较高。同时,由于没有源代码,无法对其本身的安全性进行评估,因此不能在航天软件开发上进行应用。
为了检测到是否有堆栈溢出错误发生,实际上是要监测在每个函数被调用时堆栈上存在的栈帧数目以及每个栈帧的内存需求。但由于栈帧的增减变化是在运行时动态地表现出来的,所以,静态的堆栈溢出检查有很大的困难。主要体现在以下两个方面:
第一,如何获得每个函数的栈帧的大小,也就是栈帧的内存需求。每个函数都可以定义任意数目和类型的临时变量以及输入参数,如何能够比较准确地计算所有这些变量和参数使用的内存大小。
第二,如何统计整个程序的函数调用情况。堆栈上栈帧的数目和顺序是随着函数调用序列而动态变化的,如何能够精确地跟踪程序中所有从main函数开始的调用序列对于溢出检测有着决定性的影响。用C语言写的源程序分布在不同的文件中,每个文件都包含了若干个函数,如何从这些代码中分析出每条函数调用序列。
发明内容
为了解决上述问题,为了保证堆栈的安全性,在分析了国内外堆栈检查技术的基础上,采用了John Regehr提出的通过对通用寄存器和中断控制寄存器的状态进行建模来检测堆栈溢出方法的思想。该方法将程序的运行过程表示为一个状态迁移流程图,通过对这个图的分析来判断是否存在堆栈溢出的情况。借鉴这样的思想,本发明提出了一种基于编译过程中间结果的静态堆栈检测方法,该方法对建立图和分析的方法进行了较大的改进。
本发明采用的技术方案如下:
一种基于编译过程中间结果的静态堆栈检测方法,其特征在于包括以下步骤:
1)获得每个函数的栈帧的大小;
2)获得每个函数的调用路径;
3)对所有的函数调用关系建立函数调用图;
4)遍历整个函数调用图,得到所有以main函数为起点、以底层的子函数为终点的路径。
进一步地:
在所述步骤1)中,通过分析编译器为每个函数生成的汇编代码段,从每个函数的代码段的调整栈顶指针语句中获得每个函数的栈帧的大小。
在所述步骤2)中,分析编译器为每个函数产生的RTL代码,寻找其中的调用指令,从而找到所有函数的调用关系。
在所述步骤3)中,函数调用关系图的定义如下:
函数调用关系图中的节点是程序中所有函数的集合,图中的边表示函数之间的调用关系,如果函数间存在调用关系,那么节点间通过有向弧相连接,这个有向弧从调用节点指向被调用节点,如果调用关系图中存在环,说明程序中存在递归调用。
所述步骤4)进一步包括以下步骤:
将图中所有的节点标记为未被访问的;
将图中所有的边标记为空;
堆栈大小初始化为零;
遍历函数调用关系图;
如果节点u正在被访问,则计算函数u使用的堆栈大小并加到总的堆栈大小中;
如果总的堆栈大小大于预设的堆栈最大值,则堆栈溢出;
如果节点u的邻居节点v被访问过了且v不是u的祖先节点则表明存在环;
如果节点v未被访问,则将u标记为v的祖先节点,然后以v为参数继续调用遍历函数;
通过该遍历算法并结合堆栈计算方法计算出堆栈使用的大小。
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于北京神舟航天软件技术有限公司,未经北京神舟航天软件技术有限公司许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/201010539860.4/2.html,转载请声明来源钻瓜专利网。
- 上一篇:日本鳗鱼幼鳗阶段粉状配合饲料
- 下一篇:血管相交/分支部位的提取方法和装置