[发明专利]堆栈溢出保护装置、堆栈保护方法、相关编译器和计算装置在审
申请号: | 201210041865.3 | 申请日: | 2012-02-22 |
公开(公告)号: | CN103294517A | 公开(公告)日: | 2013-09-11 |
发明(设计)人: | 蒋健;纪金松;官孝峰;张嗣元 | 申请(专利权)人: | 国际商业机器公司 |
主分类号: | G06F8/41 | 分类号: | G06F8/41 |
代理公司: | 中国国际贸易促进委员会专利商标事务所 11038 | 代理人: | 金晓 |
地址: | 美国*** | 国省代码: | 暂无信息 |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | |||
搜索关键词: | 堆栈 溢出 保护装置 保护 方法 相关 编译器 计算 装置 | ||
本发明涉及一种堆栈溢出保护装置和堆栈保护方法。根据本发明,提供了一种堆栈溢出保护装置,包括:划分单元,被配置为根据函数中的字符串型操作将输入代码中的至少一个函数划分为多个代码区域;以及堆栈保护单元,被配置为将对于所述函数的堆栈保护移动到包含字符串型操作的代码区域中。本发明还提供了一种堆栈保护方法。
技术领域
本发明总体来说涉及堆栈(stack)溢出保护装置和堆栈保护方法。更具体的,本发明涉及利用函数级变换来优化堆栈溢出保护。
背景技术
堆栈溢出是在设计程序时必须考虑的因素。附图1A-1C示意性地示出了一次堆栈溢出的情况。图1A示出了堆栈帧的示例性的结构。在图1A中,堆栈中包含了被调用者的帧、变量、返回地址、帧指针、本地数据和调用者帧。如图所示,当发生函数调用时,被调用者帧可以通过帧指针找到调用者帧的位置。变量、返回地址和帧指针都在函数调用时被使用。
如图1B所示,函数可能涉及字符串型操作,例如char A[100]表示包含100个字符的数组。在函数包含字符串型操作时,有可能导致堆栈溢出。图1C示出了示例性的堆栈溢出的情况。当向字符串A[100]写入多于100个字符(例如发生错误或遇到期望之外的情况)时,如附图1C所示,多出的字符将超出字符串A的范围,覆盖堆栈中的例如本地数据、帧指针、返回地址等。也即,发生了堆栈溢出。这可能导致本地数据被破坏、函数调用缺少了必要的返回条件等。因此,在编译器处理输入代码时必须考虑防止堆栈溢出。
堆栈保护是几乎所有商业的编译器(例如,GNU的GCC编译器,
然而,为了防止堆栈溢出,对于涉及字符串型操作的每一个函数都必须设置并校验保护码。由于编译器引入了额外的操作,这带来了显著的性能损失。另一方面,评价编译器性能优劣的一个重要方面就是对源代码编译之后产生的目标程序的运行性能。
在现有技术的编译器中,已经提出了对于堆栈溢出保护的一些优化方法。例如,在考虑堆栈保护时,可以将不涉及字符串型操作的函数视为是安全的。这样,可以避免对于那些函数进行堆栈保护,从而避免性能损失。然而,这种方法仅仅对不涉及字符串型操作的函数有效。对于涉及字符串型操作的函数则必须予以全部保护。
应当理解,此处使用的术语“字符串型操作”应当被广义地解读。其不仅仅包含通常的字符串操作(例如char),而是意在涵盖所有可能导致堆栈溢出的操作。举例来说,指针所指向的对象有可能也是字符串操作。故此,编译器未知的指针也属于可能导致堆栈溢出的操作。本领域技术人员将会知道其他可能导致堆栈溢出的操作。
发明内容
可以看出,现有的堆栈保护策略不涉及利用改变整体函数结构、函数调用关系或者函数体内部流程图来避免不必要的安全监测和保护带来的性能损失。本发明对现有技术的上述技术进行了改进,以提供一种编译性能更好,执行效率更高的编译装置及其方法。
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于国际商业机器公司,未经国际商业机器公司许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/201210041865.3/2.html,转载请声明来源钻瓜专利网。
- 上一篇:基于E语言的配网模型增量入库方法
- 下一篇:一种信息处理的方法及电子设备