首页> 中国专利> 堆栈溢出保护装置、堆栈保护方法、相关编译器和计算装置

堆栈溢出保护装置、堆栈保护方法、相关编译器和计算装置

摘要

本发明涉及一种堆栈溢出保护装置和堆栈保护方法。根据本发明,提供了一种堆栈溢出保护装置,包括:划分单元,被配置为根据函数中的字符串型操作将输入代码中的至少一个函数划分为多个代码区域;以及堆栈保护单元,被配置为将对于所述函数的堆栈保护移动到包含字符串型操作的代码区域中。本发明还提供了一种堆栈保护方法。

著录项

  • 公开/公告号CN103294517A

    专利类型发明专利

  • 公开/公告日2013-09-11

    原文格式PDF

  • 申请/专利权人 国际商业机器公司;

    申请/专利号CN201210041865.3

  • 发明设计人 蒋健;纪金松;官孝峰;张嗣元;

    申请日2012-02-22

  • 分类号G06F9/45(20060101);

  • 代理机构中国国际贸易促进委员会专利商标事务所;

  • 代理人金晓

  • 地址 美国纽约

  • 入库时间 2024-02-19 20:43:39

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2018-05-11

    授权

    授权

  • 2013-10-16

    实质审查的生效 IPC(主分类):G06F9/45 申请日:20120222

    实质审查的生效

  • 2013-09-11

    公开

    公开

说明书

技术领域

本发明总体来说涉及堆栈(stack)溢出保护装置和堆栈保护方 法。更具体的,本发明涉及利用函数级变换来优化堆栈溢出保护。

背景技术

堆栈溢出是在设计程序时必须考虑的因素。附图1A-1C示意性 地示出了一次堆栈溢出的情况。图1A示出了堆栈帧的示例性的结 构。在图1A中,堆栈中包含了被调用者的帧、变量、返回地址、帧 指针、本地数据和调用者帧。如图所示,当发生函数调用时,被调用 者帧可以通过帧指针找到调用者帧的位置。变量、返回地址和帧指针 都在函数调用时被使用。

如图1B所示,函数可能涉及字符串型操作,例如char A[100]表 示包含100个字符的数组。在函数包含字符串型操作时,有可能导致 堆栈溢出。图1C示出了示例性的堆栈溢出的情况。当向字符串 A[100]写入多于100个字符(例如发生错误或遇到期望之外的情况) 时,如附图1C所示,多出的字符将超出字符串A的范围,覆盖堆栈 中的例如本地数据、帧指针、返回地址等。也即,发生了堆栈溢出。 这可能导致本地数据被破坏、函数调用缺少了必要的返回条件等。因 此,在编译器处理输入代码时必须考虑防止堆栈溢出。

堆栈保护是几乎所有商业的编译器(例如,GNU的GCC编译 器,IBMXL编译器,Microsoft的Visual Studio编译器)都提供的 功能。在现有技术中存在多种堆栈保护的方法,典型的是插入保护码 (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耦合的有CPU 1001、 RAM 1002、ROM 1003、硬盘控制器1005、键盘控制器1006、串行 控制器1007、并行控制器1008和显示控制器1009。硬盘1010与硬 盘控制器1005耦合,键盘1011与键盘控制器1006耦合,串行外部 设备1012与串行接口控制器1007耦合,并行外部设备1013与并行 接口控制器1008耦合,以及显示器1014与显示控制器1009耦合。 应当理解,图10所述的结构框图仅仅是为了示例的目的,而不是对 本发明范围的限制。在某些情况下,可以根据具体情况增加或减少某 些设备

所属技术领域的技术人员知道,本发明可以实现为系统、方法 或计算机程序产品。因此,本公开可以具体实现为以下形式,即:可 以是完全的硬件、也可以是完全的软件(包括固件、驻留软件、微代 码等),还可以是硬件和软件结合的形式,本文一般称为“电路”、 “模块”或“系统”。此外,在一些实施例中,本发明还可以实现为在一 个或多个计算机可读介质中的计算机程序产品的形式,该计算机可读 介质中包含计算机可读的程序代码。

可以采用一个或多个计算机可读的介质的任意组合。计算机可读 介质可以是计算机可读信号介质或者计算机可读存储介质。计算机可 读存储介质例如可以是——但不限于——电、磁、光、电磁、红外 线、或半导体的系统、装置或器件,或者任意以上的组合。计算机可 读存储介质的更具体的例子(非穷举的列表)包括:具有一个或多个 导线的电连接、便携式计算机磁盘、硬盘、随机存取存储器 (RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM 或闪存)、光纤、便携式紧凑磁盘只读存储器(CD-ROM)、光存储器 件、磁存储器件、或者上述的任意合适的组合。在本文件中,计算机 可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被 指令执行系统、装置或者器件使用或者与其结合使用。

计算机可读的信号介质可以包括在基带中或者作为载波一部分传 播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据 信号可以采用多种形式,包括——但不限于——电磁信号、光信号或 上述的任意合适的组合。计算机可读的信号介质还可以是计算机可读 存储介质以外的任何计算机可读介质,该计算机可读介质可以发送、 传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合 使用的程序。

计算机可读介质上包含的程序代码可以用任何适当的介质传输, 包括——但不限于——无线、电线、光缆、RF等等,或者上述的任 意合适的组合。

可以以一种或多种程序设计语言或其组合来编写用于执行本发明 操作的计算机程序代码,所述程序设计语言包括面向对象的程序设计 语言—诸如Java、Smalltalk、C++,还包括常规的过程式程序设计 语言—诸如”C”语言或类似的程序设计语言。程序代码可以完全地在 用户计算机上执行、部分地在用户计算机上执行、作为一个独立的软 件包执行、部分在用户计算机上部分在远程计算机上执行、或者完全 在远程计算机或服务器上执行。在涉及远程计算机的情形中,远程计 算机可以通过任意种类的网络——包括局域网(LAN)或广域网 (WAN)—连接到用户计算机,或者,可以连接到外部计算机(例如 利用因特网服务提供商来通过因特网连接)。

下面将参照本发明实施例的方法、装置(系统)和计算机程序产 品的流程图和/或框图描述本发明。应当理解,流程图和/或框图的每 个方框以及流程图和/或框图中各方框的组合,都可以由计算机程序 指令实现。这些计算机程序指令可以提供给通用计算机、专用计算机 或其它可编程数据处理装置的处理器,从而生产出一种机器,这些计 算机程序指令通过计算机或其它可编程数据处理装置执行,产生了实 现流程图和/或框图中的方框中规定的功能/操作的装置。

也可以把这些计算机程序指令存储在能使得计算机或其它可编程 数据处理装置以特定方式工作的计算机可读介质中,这样,存储在计 算机可读介质中的指令就产生出一个包括实现流程图和/或框图中的 方框中规定的功能/操作的指令装置(instruction means)的制造品 (manufacture)。

也可以把计算机程序指令加载到计算机、其它可编程数据处理装 置、或其它设备上,使得在计算机、其它可编程数据处理装置或其它 设备上执行一系列操作步骤,以产生计算机实现的过程,从而使得在 计算机或其它可编程装置上执行的指令能够提供实现流程图和/或框 图中的方框中规定的功能/操作的过程。

根据本发明的一个实施例,依据源代码中的各函数是否涉及字符 串型操作,可以在函数内部的某一代码区域中设置堆栈保护。在一个 实施例中,可以将涉及字符串型操作的代码区域外联为新的函数,作 为原函数的被调用函数。由此,只需要对涉及字符串型操作的代码区 域(被调用函数)提供堆栈保护,而无需保护原函数中的其他部分。 由此,可以提高编译后的目标代码的执行效率。根据以下的说明,本 发明的上述和其他方面将变得更加清楚。

图3示出了根据现有技术的对于示例性函数A进行堆栈保护的 示意图。如图所示,在进入函数A时,首先设置保护码。在离开函 数A时,将校验保护码。在函数A中,代码部分3001-3006可以代 表任何不包含字符串型操作的代码段。如图所示,由于函数A包含 字符串型操作3007,因此在每次调用函数A时都必须进行堆栈保 护,以防止堆栈溢出。现有技术中的编译器由此在进入函数A之后 立刻插入保护码,并且在离开函数A之前校验保护码。

当对示例性函数A进行分析时,可以认为它包括三个部分:循 环3000、代码区域3100及代码区域3200。可以发现,并非所有的 代码区域都包含字符串型操作。具体来说,当循环3000满足跳出条 件时,如果执行代码区域3100,那么此时函数A的执行将不涉及字 符串型操作。

因此,如图4所示,本发明提出了将函数A进一步划分,仅在 涉及字符串型操作的代码区域3200中设置堆栈保护,而并非对于整 个函数A进行堆栈保护。为了清楚起见,在图4中,与图3中相同 的部分沿用了相同的附图标记。如图所示,在编译时,编译器对函数 A进行解析,分析出其中涉及字符串型操作的区域为区域4200。上 述分析可以利用现有技术完成。由此,编译器将函数A划分为循环 3000、代码区域4100和涉及字符串型操作的代码区域4200。

进一步的,如上所述,当执行函数A时,程序的执行有可能选 择循环3000、代码区域4100的路径。该路径不涉及字符串型操作, 故此无需对该路径进行保护。相反,只需要在函数涉及字符串型操作 的代码区域4200提供堆栈保护即可。换言之,当函数的执行进入代 码区域4200时,代表着函数的执行涉及了字符串型操作。此时有可 能涉及堆栈溢出。故此,只需要在函数执行区域4200时提供堆栈保 护就足够了。

如此处使用的,术语“代码区域”意指一条或多条代码的集合。本 领域技术人员将会理解,根据本发明的实施例,划分代码区域的一个 必要条件是是否包含字符串型操作。除此之外,划分代码区域的其他 条件可以根据具体应用而增加。

举例来说,在图4中,取决于是否包含字符串型操作,可以仅将 字符串型操作3009单独划分为一个代码区域,而函数的其他部分可 以作为不包含字符串型操作的代码区域。在另一个实施例,考虑到一 段代码区域的完整性和相互之间的关联性,可以将包含字符串型操作 3009的代码区域4200作为一个代码区域。

本领域技术人员可以理解,还可以存在其他各种划分代码区域的 规则,本领域技术人员可以根据实际应用而选择其他的划分代码区域 的规则。然而,根据本发明的实施例,划分代码区域的一个必要条件 是是否包含字符串型操作。

在一个实施例中,编译器对该区域4200加入保护码操作。例 如,使得函数在进入代码区域4200时在堆栈的适当位置设置保护 码,并且在离开代码区域4200时校验该保护码。也即,将对于原函 数A的保护移动到原函数A的一部分代码区域中。

当执行函数A时,所执行的操作可能只包含循环3000和代码区 域4100的路径。而根据本发明,编译器增加的保护码操作并不位于 该路径中,而是位于代码区域4200中。因此,与附图3中每次函数 A都执行编译器增加的保护码操作相比,在本发明中,编译器增加的 保护码操作的执行频率被降低了。换言之,根据本发明,只有涉及执 行函数A的特定部分时才需要执行保护操作,而并非对于函数A整 体地提供保护。

在实践中,在大多数情况下,循环3000和代码区域4100往往是 函数的高频代码区域,并且涉及字符串型操作的代码区域4200往往 是操作频率相当低的区域。以附图4为例,一种普遍的情况是:例 如,循环3000涉及某些复杂的计算工作;当满足了预定的条件时, 计算从循环3000中退出,计算结果经过代码区域4100的处理被作为 函数的结果返回。另一方面,代码区域4200仅仅用于在计算出现错 误时输出预定的消息或者向日志中写入某些消息。

这样的实际情况将使得本发明的效果变得更加明显。在绝大多数 情况下,函数采用分支循环3000和代码区域4100。该路径不涉及编 译器增加的堆栈保护代码。另一方面,仅仅在执行代码区域4200的 少数情况下,函数的执行才会包括由编译装置增加的代码。

由此可见,在函数中包含执行频率不同的代码区域时,本发明可 以提高通过改变堆栈保护的执行位置而提高代码的执行效率。进一步 的,当函数中包括执行频率差别显著的高频区域和包括字符串型操作 的低频区域时,本发明可以提供更高的代码执行效率。

在可选实施例中,可以进一步根据代码区域4200的执行频率来 确定是否改变堆栈保护的位置。很清楚地是,代码区域4200的执行 频率越低,堆栈保护执行的频率也越低,则改变堆栈保护执行位置所 得到的性能提升就越多。与此相比,如果区域4200的执行频率较 高,那么所得到的性能提升就会减小。因此,在根据本发明的一个实 施例中,在代码区域4200的执行频率低于预定阈值时才移动堆栈保 护的位置。反之,则不改变执行堆栈保护的位置。

本领域技术人员应当理解,此处所述的函数的某一代码区域的执 行频率是指该区域执行频率与该函数执行频率之比。例如,当函数被 执行100次,发现其中的10次中执行了该区域,那么该代码区域的 执行频率为10/100=10%。

如本领域技术人员所知的,编译器在对输入代码进行解析时,能 够分析出某一函数以及某一代码区域的执行频率。例如,编译器通过 分析函数之间的跳转关系可以得出函数的执行频率,或者,编译器可 以在函数的各个区域插入检测点,测试运行该函数,并且根据程序经 过检测点的次数来得到上述函数的执行频率和代码区域的执行频率。

一些编译器对于堆栈保护设置了预定的规则。例如,在GCC或 IBMXL编译器中,堆栈保护应当被设置在每一个函数的入口处。 对于此类编译器,可以遵循相关的特定规则来应用本发明。例如,在 上述编译器中,将涉及字符串型操作的代码区域构建为一个新的函 数。该新的函数作为原函数的被调用函数。如图6所示,将代码区域 4200构建为函数A的被调用函数B。并且在该函数B中设置堆栈保 护。对于GCC或IBMXL编译器,可以根据其中提供的外联 (outline)功能实现上述函数的构建。这将在以下具体实施例中详细 描述。

本领域技术人员将会明白,根据本发明的教导,各编译器对于堆 栈保护的设置规则并不会限制本发明的实施。

以下将讲述根据本发明的实施例的编译方法和堆栈溢出保护装 置。附图5示出了根据本发明实施例的编译方法5000的流程图。

在步骤5100,根据字符串型操作将输入代码中的至少一个函数 划分为多个代码区域。本领域技术人员公知的是,现有的编译器可以 解析函数中多个代码区域是否包含字符串型操作。例如,GCC、 IBMXL编译器等都具备这样的功能。

在步骤5200,在包含字符串型操作的代码区域中设置堆栈保 护。

根据本发明的可选实施例,改变执行堆栈保护的位置适用于所有 包含字符串型操作的代码区域。

另一方面,在另一个可选实施例中,考虑到包含字符串型操作的 代码区域的执行频率,可以仅将堆栈保护移动到低频代码区域中。在 一个实施例中,仅在代码区域的执行频率小于预定阈值时才对将堆栈 保护执行的位置从原函数入口处移动到该代码区域中。

如此处使用的,术语“低频”是相对的概念。在一个实施例中,所 述预定阈值是小于50%的常数。例如但不限于,可行的例子有 40%、30%、20%、10%、5%等。

在另一实施例中,根据统计计算的结果确定所述阈值。例如,利 用各代码区域所属函数的重要性作为权重,对所有包含字符串型操作 的低频代码区域的执行频率进行加权平均。对执行频率低于加权平均 值的代码区域改变堆栈保护位置。对于执行频率高于加权平均值的代 码区域,则不改变堆栈保护的执行位置。对于加权平均的实现,本领 域技术人员可以根据具体应用而有所变化。

取决于编译器的规则,可以将低频代码区域构建为一个新的函数 来实施上述实施例。如图6所示,包含代码区域4200被构建为函数 B。函数B作为函数A的被调用函数。代码保护措施从函数A中被 移动到该函数B中。这使得函数A的其他路径不必经过堆栈保护, 从而提高了代码的执行效率。本领域技术人员公知的是,由于函数具 有单入口和单出口(也即,函数中所有可能程序流都必须经唯一的出 口进入函数并经由唯一的出口离开函数),因此将被构成函数的代码 区域也应当被划分为单入口和单出口的。

函数B的构建可以通过一些编译器提供的功能实现。例如,对 于GCC、IBMXL编译器来说,其提供了外联功能。外联能够将源 代码中的一部分代码构建为一个新的函数,并且自动建立该函数的调 用出入口准备,参数列表和传递,函数调用。

值得一提的是,尽管堆栈保护的执行被设置在被调用函数中,然 而其仍然保护的是原函数的堆栈。这是因为,被调用函数仍然是原函 数的一部分,故此,只要计算得出原函数的堆栈位置,就可以将保护 码插入到原函数堆栈中,从而对原函数的整体进行保护。将结合附图 7描述上述内容。

附图7示出了根据该可选实施例的设置保护码的处理。可以通过 以下示意性的代码对被调用函数设置保护码。

//guard check

//get caller’s FramePointer

LOAD r9=[FP]

STORE[r9-4]=_magic_number

其中FP代表原函数的帧指针(例如附图4中的函数A),而数 值4是编译器规定的帧指针的长度。由于堆栈是向上生长的,故此, (r9-4)表示了函数A的最开始位置。在该位置插入保护码数值 _magic_number。本领域技术人员应当理解,此处的_magic_number 可以是任何适当的数值。

另一方面,校验保护码的示例性代码如下:

//guard check

LOAD r9=[FP]

LOAD r10=[r9-4]

COMPARE r10,_magic_number

在校验时,仍然找到原函数A的入口地址,并偏移4位。在那 里可以获得原先存储的校验值,并与预定值相比较。

本领域技术人员可以理解,不需要外联的情况下,可以类似地通 过编译器得出插入执行保护的位置,并且以类似的方式加入堆栈保 护。

在有些情况下,在函数的低频代码区域中可能包含多个字符串型 操作。如图8所示,函数A的代码区域代码区域4200包括了两个字 符串型操作(也可以是更多个)。正如上文所述,由于此处设置的堆 栈保护仍然是保护原函数A的堆栈,故此可以对两个字符串型操作 一并设置代码保护。在其他情况中,函数A可以在不同的低频代码 区域中包含多个字符串型操作。例如,函数A还包括与代码区域 4200并行的低频代码区域4300、4400(未示出)。低频代码区域 4300和4400均具有字符串型操作。对于上述情况,只要各低频代码 区域之间不存在高频代码区域,那么可以将上述多个低频代码区域一 并设置堆栈保护。这有助于进一步提高编译后的代码执行效率。本领 域技术人员将会理解,优选地,在可能的情况下,将多个包含字符串 型操作的低频代码区域外联为一个函数。这将有利于进一步提高编译 后代码执行的效率。

同样的,在将代码区域4200外联为被调用函数的情况下,可以 将字符串型操作1和字符串型操作2外联到同一个被调用函数内。或 者类似的,在多个低频代码区域之间不存在高频代码区域时,可以将 上述多个低频代码区域外联为一个被调用函数,并且将堆栈保护的执 行移动到该被调用函数中。

以下将根据附图介绍根据本发明的实施例的编译装置。

图9A示出了根据本发明的一个实施例的堆栈溢出保护装置 9000。装置9000包括划分单元9100和堆栈保护单元9200。划分单 元9100根据函数中的字符串型操作将输入代码中的至少一个函数划 分为多个代码区域。堆栈保护单元9200将对于所述函数的堆栈保护 移动到包含字符串型操作的代码区域中。在一个实施例中,堆栈保护 采取保护码的形式。在其他实施例中,本领域技术人员还可以设想出 其他可行的堆栈保护措施。

在划分单元9100将函数划分为涉及字符串型操作的代码区域和 不涉及字符串型操作的代码区域之后,在根据本发明的一个实施例 中,划分单元9100可以进一步将涉及字符串型操作的代码区域根据 执行频率进一步将上述代码区域划分为高频代码区域和低频代码区 域。堆栈保护单元9200将对原函数的堆栈保护措施移动到低频代码 区域中。

根据本发明的可选实施例,如图9B所示,堆栈溢出保护装置 9000还包括外联单元9300。外联单元9300根据预定的编译规则将包 含字符串型操作的代码区域外联为原函数的被调用函数。堆栈保护单 元9200根据外联单元9300的外联结果,将对于原函数的堆栈保护移 动到外联的被调用函数中。在可选实施例中,堆栈保护单元9200可 以进一步包括保护码应用单元9250(未示出)。如上文所述的,保 护码应用单元9250根据原函数和被调用者函数的帧指针计算出插入 保护码的位置。在该实施例中,保护码保护原函数的堆栈。

类似的,在具有外联单元9300的实施例中,外联单元9300将低 频代码区域外联为原函数的被调用函数。堆栈保护单元9200将对原 函数的堆栈保护措施移动到被调用函数中。在一个实施例中,低频可 以指执行频率低于阈值50%。然而,本领域技术人员可以根据实际 应用选择其他的阈值。例如,可以采用低于50%的常数。例如但不 限于,可行的例子有40%、30%、20%、10%、5%等。

在另一实施例中,根据统计计算的结果确定所述阈值。例如,利 用各函数的重要性作为权重,对所有包含字符串型操作的代码区域的 执行频率进行加权平均。对执行频率低于加权平均值的代码区域(被 调用函数)改变堆栈保护位置。对于执行频率高于加权平均值的代码 区域(被调用函数),则不改变堆栈保护的执行位置,仍然按照现有 技术对于函数整体地进行保护。

附图中的流程图和框图显示了根据本发明的多个实施例的系统、 方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点 上,流程图或框图中的每个方框可以代表一个模块、程序段或代码的 一部分,所述模块、程序段或代码的一部分包含一个或多个用于实现 规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现 中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。 例如,两个连续的方框实际上可以基本并行地执行,它们有时也可以 按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和 /或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可 以用执行规定的功能或操作的专用的基于硬件的系统来实现,或者可 以用专用硬件与计算机指令的组合来实现。

以上已经描述了本发明的各实施例,上述说明是示例性的,并非 穷尽性的,并且也不限于所披露的各实施例。在不偏离所说明的各实 施例的范围和精神的情况下,对于本技术领域的普通技术人员来说许 多修改和变更都是显而易见的。本文中所用术语的选择,旨在最好地 解释各实施例的原理、实际应用或对市场中的技术的技术改进,或者 使本技术领域的其它普通技术人员能理解本文披露的各实施例。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号