堆栈溢出保护装置、堆栈保护方法、相关编译器和计算装置制造方法及图纸

技术编号:9143010 阅读:125 留言:0更新日期:2013-09-12 04:35
本发明专利技术涉及一种堆栈溢出保护装置和堆栈保护方法。根据本发明专利技术,提供了一种堆栈溢出保护装置,包括:划分单元,被配置为根据函数中的字符串型操作将输入代码中的至少一个函数划分为多个代码区域;以及堆栈保护单元,被配置为将对于所述函数的堆栈保护移动到包含字符串型操作的代码区域中。本发明专利技术还提供了一种堆栈保护方法。

【技术实现步骤摘要】
堆栈溢出保护装置、堆栈保护方法、相关编译器和计算装置
本专利技术总体来说涉及堆栈(stack)溢出保护装置和堆栈保护方法。更具体的,本专利技术涉及利用函数级变换来优化堆栈溢出保护。
技术介绍
堆栈溢出是在设计程序时必须考虑的因素。附图1A-1C示意性地示出了一次堆栈溢出的情况。图1A示出了堆栈帧的示例性的结构。在图1A中,堆栈中包含了被调用者的帧、变量、返回地址、帧指针、本地数据和调用者帧。如图所示,当发生函数调用时,被调用者帧可以通过帧指针找到调用者帧的位置。变量、返回地址和帧指针都在函数调用时被使用。如图1B所示,函数可能涉及字符串型操作,例如charA[100]表示包含100个字符的数组。在函数包含字符串型操作时,有可能导致堆栈溢出。图1C示出了示例性的堆栈溢出的情况。当向字符串A[100]写入多于100个字符(例如发生错误或遇到期望之外的情况)时,如附图1C所示,多出的字符将超出字符串A的范围,覆盖堆栈中的例如本地数据、帧指针、返回地址等。也即,发生了堆栈溢出。这可能导致本地数据被破坏、函数调用缺少了必要的返回条件等。因此,在编译器处理输入代码时必须考虑防止堆栈溢出。堆栈保护是几乎所有商业的编译器(例如,GNU的GCC编译器,XL编译器,Microsoft的VisualStudio编译器)都提供的功能。在现有技术中存在多种堆栈保护的方法,典型的是插入保护码(guard)。在附图2A中示出了保护码应用的例子。对于需要保护的堆栈,可以插入适当的保护码并校验该保护码以实现堆栈保护。例如,如图2A所示,在进入函数时在堆栈中适当的位置插入值0x1234。如果函数中的字符串被过度地写入,则该值会被覆盖。因此在离开该函数时,如图2B所示,如果检测到该保护码被改写(在图中被示例性地改变为0x5678),那么就检测到了堆栈溢出的情况。编译器负责为源代码加入附加的代码以实现上述堆栈保护工作。然而,为了防止堆栈溢出,对于涉及字符串型操作的每一个函数都必须设置并校验保护码。由于编译器引入了额外的操作,这带来了显著的性能损失。另一方面,评价编译器性能优劣的一个重要方面就是对源代码编译之后产生的目标程序的运行性能。在现有技术的编译器中,已经提出了对于堆栈溢出保护的一些优化方法。例如,在考虑堆栈保护时,可以将不涉及字符串型操作的函数视为是安全的。这样,可以避免对于那些函数进行堆栈保护,从而避免性能损失。然而,这种方法仅仅对不涉及字符串型操作的函数有效。对于涉及字符串型操作的函数则必须予以全部保护。应当理解,此处使用的术语“字符串型操作”应当被广义地解读。其不仅仅包含通常的字符串操作(例如char),而是意在涵盖所有可能导致堆栈溢出的操作。举例来说,指针所指向的对象有可能也是字符串操作。故此,编译器未知的指针也属于可能导致堆栈溢出的操作。本领域技术人员将会知道其他可能导致堆栈溢出的操作。
技术实现思路
可以看出,现有的堆栈保护策略不涉及利用改变整体函数结构、函数调用关系或者函数体内部流程图来避免不必要的安全监测和保护带来的性能损失。本专利技术对现有技术的上述技术进行了改进,以提供一种编译性能更好,执行效率更高的编译装置及其方法。根据本专利技术的一方面,提供了一种用于对输入代码提供堆栈溢出保护的装置,包括:划分单元,被配置为将输入代码中的至少一个函数划分为包含字符串型操作的代码区域和不包含字符串型操作的代码区域;以及堆栈保护单元,被配置为在包含字符串型操作的代码区域中设置堆栈保护。根据本专利技术的另一方面,提供了一种用于对输入代码提供堆栈溢出保护的方法,包括:将输入代码中的至少一个函数划分为包含字符串型操作的代码区域和不包含字符串型操作的代码区域;以及在包含字符串型操作的代码区域中设置堆栈保护。本专利技术还提供了包括如本专利技术上述方面所述的堆栈溢出保护装置的编译器。本专利技术还提供了包括如本专利技术上述方面所述的编译器的计算装置。附图说明通过结合附图对本公开示例性实施方式进行更详细的描述,本公开的上述以及其它目的、特征和优势将变得更加明显,其中,在本公开示例性实施方式中,相同的参考标号通常代表相同部件。图1A-1C示出了堆栈溢出的示意图;图2A-2B示出了现有技术中的堆栈保护方法;图3示出了对于函数A的现有的堆栈保护;图4示出了根据本专利技术的改进的堆栈保护的一个示例性实施例;图5示出了根据本专利技术的一个示例性实施例的改进的堆栈保护方法的流程图;图6示出了根据本专利技术示例性实施例的改进的堆栈保护的另一实施例;图7示出了根据本专利技术的一个示例性实施例的堆栈保护的细节;图8示出了根据本专利技术示例性实施例的改进的堆栈保护的又一实施例;图9A-9B示出了根据本专利技术示例性实施例的堆栈溢出保护装置;以及图10示出了适于用来实现本专利技术实施方式的示例性计算系统1000的框图。具体实施方式下面将参照附图更详细地描述本公开的优选实施方式。虽然附图中显示了本公开的优选实施方式,然而应该理解,可以以各种形式实现本公开而不应被这里阐述的实施方式所限制。相反,提供这些实施方式是为了使本公开更加透彻和完整,并且能够将本公开的范围完整的传达给本领域的技术人员。图10示出了适于用来实现本专利技术实施方式的示例性计算系统1000的框图。如图10所示,计算机系统1000可以包括:CPU(中央处理单元)1001、RAM(随机存取存储器)1002、ROM(只读存储器)1003、系统总线1004、硬盘控制器1005、键盘控制器1006、串行接口控制器1007、并行接口控制器1008、显示控制器1009、硬盘1010、键盘1011、串行外部设备1012、并行外部设备1013和显示器1014。在这些设备中,与系统总线1004耦合的有CPU1001、RAM1002、ROM1003、硬盘控制器1005、键盘控制器1006、串行控制器1007、并行控制器1008和显示控制器1009。硬盘1010与硬盘控制器1005耦合,键盘1011与键盘控制器1006耦合,串行外部设备1012与串行接口控制器1007耦合,并行外部设备1013与并行接口控制器1008耦合,以及显示器1014与显示控制器1009耦合。应当理解,图10所述的结构框图仅仅是为了示例的目的,而不是对本专利技术范围的限制。在某些情况下,可以根据具体情况增加或减少某些设备。所属
的技术人员知道,本专利技术可以实现为系统、方法或计算机程序产品。因此,本公开可以具体实现为以下形式,即:可以是完全的硬件、也可以是完全的软件(包括固件、驻留软件、微代码等),还可以是硬件和软件结合的形式,本文一般称为“电路”、“模块”或“系统”。此外,在一些实施例中,本专利技术还可以实现为在一个或多个计算机可读介质中的计算机程序产品的形式,该计算机可读介质中包含计算机可读的程序代码。可以采用一个或多个计算机可读的介质的任意组合。计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质。计算机可读存储介质例如可以是——但不限于——电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子(非穷举的列表)包括:具有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存本文档来自技高网
...
堆栈溢出保护装置、堆栈保护方法、相关编译器和计算装置

【技术保护点】
一种用于对输入代码提供堆栈溢出保护的装置,包括:划分单元,被配置为将输入代码中的至少一个函数划分为包含字符串型操作的代码区域和不包含字符串型操作的代码区域;以及堆栈保护单元,被配置为在包含字符串型操作的代码区域中设置堆栈保护。

【技术特征摘要】
1.一种用于对输入代码提供堆栈溢出保护的装置,包括:划分单元,被配置为将输入代码中的至少一个函数划分为包含字符串型操作的代码区域和不包含字符串型操作的代码区域;以及堆栈保护单元,被配置为依据所述函数是否涉及字符串型操作,在包含字符串型操作的代码区域中设置堆栈保护,并且排除对所述函数中不涉及字符串型操作的部分的堆栈保护,其中,设置堆栈保护包括对该包含字符串型操作的代码区域加入保护码操作。2.如权利要求1所述的堆栈溢出保护装置,所述划分单元被进一步配置为根据执行频率将所述包含字符串型操作的代码区域划分为高频代码区域和低频代码区域;以及所述堆栈保护单元被进一步配置为在所述低频代码区域中设置堆栈保护。3.如权利要求1所述的堆栈溢出保护装置,进一步包括:外联单元,被配置为将包含字符串型操作的代码区域外联为所述函数的被调用函数;所述堆栈保护单元被配置为在所述被调用函数中设置堆栈保护。4.如权利要求3所述的堆栈溢出保护装置,所述划分单元被进一步配置为根据执行频率将所述包含字符串型操作的代码区域划分为高频代码区域和低频代码区域;以及所述外联单元被进一步配置为将所述低频代码区域外联为所述函数的被调用函数。5.如权利要求2或4所述的堆栈溢出保护装置,其中所述低频代码区域的执行频率低于预定阈值。6.如权利要求4所述的堆栈溢出保护装置,其中在一个函数中存在多个低频字符串型操作且各低频字符串型操作之间不存在高频操作的情况下,所述外联单元适于将所述多个低频字符串型操作外联到一个被调用函数中。7.如权利要求5所述的堆栈溢出保护装置,其中所述预定阈值是根据所述低频代码区域的执行频率的统计数据决定的。8.如权利要求4所述的堆栈溢出保护装置,其中所述堆栈保护单元包括保护码应用单元,所述保护码应用单元被配置为在所述被调用函数中设置堆栈保护操作;其中所述保护码应用单元根据所述函数和所述被调用函数的帧指针计算出设置堆栈保护操作的位置,并且根据所计算出的设置堆栈保护操作的位置,在所述被调用函数中设置堆栈保护...

【专利技术属性】
技术研发人员:蒋健纪金松官孝峰张嗣元
申请(专利权)人:国际商业机器公司
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1