用于计算机程序的内存耗尽处理的方法、装置及系统制造方法及图纸

技术编号:38613600 阅读:15 留言:0更新日期:2023-08-26 23:41
本说明书实施例提供用于计算机程序的内存耗尽处理的方法、装置及系统。在进行内能预留处理时,对计算机程序中的需要进行内存预留处理的目标内存分配函数进行内存开销分析,得到目标内存分配函数的内存开销表达式;在计算机程序的预编译期间,经由过程宏读取目标内存分配函数的内存开销表达式,并根据内存开销表达式进行过程宏展开以生成内存预留语句,内存预留语句包括内存预留值计算语句和内存预留功能API调用语句;以及对经过过程宏展开后的计算机程序进行后续编译,得到计算机程序的可执行文件。执行文件。执行文件。

【技术实现步骤摘要】
用于计算机程序的内存耗尽处理的方法、装置及系统


[0001]本说明书实施例通常涉及计算机
,尤其涉及用于计算机程序的内存耗尽处理的方法、装置及系统。

技术介绍

[0002]计算机程序在运行过程中,需要向操作系统申请内存来进行数据存储等操作,以保证计算机程序功能的正确执行。但操作系统的内存有限,当内存基本用光而无法满足计算机程序的内存申请时,就会发生内存分配失败。此时,如果在计算机程序代码中没有明确编写在内存分配失败时如何处理,则计算机程序在之后的运行中极大概率会发生各种各样的执行错误,比如,产生一些危险漏洞。通常来讲,计算机程序中每处分配内存的程序代码都可能会发生内存分配失败,因此,理想情况下,每处内存分配程序代码需要编写对应的内存分配失败处理代码。以帮助计算机程序从内存分配失败情形下顺利退出或恢复。
[0003]然而,计算机程序中涉及到内存分配的程序代码众多,从而使得开发人员需要花费巨大工作量来编写内存分配失败处理代码,并且非常容易发生遗漏。此外,内存分配失败处理代码中会存在一些简单的错误信息生成或回退操作,这些处理也涉及到内存分配。由于此时系统内存基本耗尽,如果内存分配失败处理代码中存在不恰当的内存分配,则可能会触发二次内存分配失败,进而导致系统直接崩溃。

技术实现思路

[0004]本说明书实施例提供用于计算机程序的内存耗尽处理的方法、装置及系统。利用该内存耗尽处理方法、装置及系统,可以满足内存分配失败处理的需要,同时降低内存分配失败处理错误的风险以及减轻开发人员的工作量。
[0005]根据本说明书实施例的一个方面,提供一种用于计算机程序的内存耗尽处理的方法,包括:对计算机程序中的需要进行内存预留处理的目标内存分配函数进行内存开销分析,得到所述目标内存分配函数的内存开销表达式;在所述计算机程序的预编译期间,经由过程宏读取所述目标内存分配函数的内存开销表达式,并根据所述内存开销表达式进行过程宏展开以生成内存预留语句,所述内存预留语句包括内存预留值计算语句和内存预留功能API调用语句;以及对经过过程宏展开后的计算机程序进行后续编译,得到所述计算机程序的可执行文件。
[0006]可选地,在上述方面的一个示例中,所述方法还可以包括:响应于所述计算机程序的可执行文本被执行,经由所述内存预留语句调用代理内存分配器来为所述目标内存分配函数实现内存预留,所述代理内存分配器在所述过程宏中被声明为全局内存分配器。
[0007]可选地,在上述方面的一个示例中,所述代理内存分配器具有默认内存分配器的引用能力。
[0008]可选地,在上述方面的一个示例中,对计算机程序中的需要进行内存预留处理的目标内存分配函数进行内存开销分析,得到所述目标内存分配函数的内存开销表达式可以
包括:对计算机程序中的需要进行内存预留处理的目标内存分配函数进行基于静态分析的内存开销分析,得到所述目标内存分配函数的内存开销表达式。
[0009]可选地,在上述方面的一个示例中,对计算机程序中的需要进行内存预留处理的目标内存分配函数进行基于静态分析的内存开销分析,得到所述目标内存分配函数的内存开销表达式可以包括:根据所述计算机程序的函数调用图,通过函数调用链遍历来自底向上查找出所有目标内存分配函数;针对每个目标内存分配函数,获取该目标内存分配函数所调用的内存分配函数的内存开销表达式;针对每个内存分配函数调用,使用基于所述计算机程序的函数数值流图的静态数值流分析获取该内存分配函数调用的传入参数的内存开销表达式,并对所对应的内存分配函数的内存开销表达式中的传入参数进行表达式替换,得到该内存分配函数调用的内存开销表达式;以及使用基于所述计算机程序的函数控制流图的控制流分析,对该目标内存分配函数内的所有内存分配函数调用的内存开销表达式进行整合,得到该目标内存分配函数的内存开销表达式。
[0010]可选地,在上述方面的一个示例中,针对每个内存分配函数调用,使用基于所述计算机程序的函数数值流图的静态数值流分析获取该内存分配函数调用的传入参数的内存开销表达式包括:针对每个传入参数,自该传入参数对应的目标结点起进行深度优先搜索直到到达终止结点,以在所述函数数值流图中查找该传入参数的关联结点,并基于所查找到的关联结点,自终止结点起递归地生成该传入参数的内存开销表达式。
[0011]可选地,在上述方面的一个示例中,所查找到的每个结点的内存开销表达式经由给定语法解析器来根据该结点的结点类型进行操作和语法解析来递归生成。
[0012]可选地,在上述方面的一个示例中,针对传入参数的静态数值流分析包括过程间分析,以及在构建所述函数数值流图时,为每个函数调用结点和参数结点的传入边分配调用ID,同一函数调用点的调用ID相同,并且在所述过程间分析时维护用于记录调用ID的函数调用栈以实现函数调用点区分。
[0013]可选地,在上述方面的一个示例中,针对传入参数的静态数值流分析包括域敏感分析,并且在所述域敏感分析时维护用于记录域信息的域信息栈,所述域信息用于指示目标值在变量结构体中的域索引。
[0014]可选地,在上述方面的一个示例中,所述域信息采用目标值在所述变量结构体中的偏移量和实际大小表征。
[0015]可选地,在上述方面的一个示例中,所述基于所述计算机程序的函数控制流图的控制流分析包括采用基于处理队列的拓扑序遍历的控制流分析,所述处理队列中的基本块采取先进先出处理策略。
[0016]可选地,在上述方面的一个示例中,所述函数控制流图中的强连通分量被整体处理为强连通分量基本块,以及强连通分量的所有入边和出边作为对应强连通分量基本块的入边和出边。
[0017]可选地,在上述方面的一个示例中,所述基于处理队列的拓扑序遍历的控制流分析可以包括:获取当前基本块的所有后续基本块;针对每个后续基本块,响应于该后续基本块为强连通分量基本块,跳转到该后续基本块执行后续处理;响应于该后续基本块的入度大于1,对所述当前基本块和该后续基本块的内存开销表达式进行合并处理;响应于该后续基本块的入度大于1,将所述当前基本块的开销表达式添加到该后续基本块的内存开销表
达式;响应于该后续基本块的所有前序基本块都已遍历,将该后续基本块加入处理队列。
[0018]可选地,在上述方面的一个示例中,在所述强连通分量基本块是基本循环类型时,在每次缩环时,所述强连通分量基本块的内存开销表达式根据该次缩环时的循环迭代次数表达式和环内内存分配函数调用的内存开销表达式确定。
[0019]可选地,在上述方面的一个示例中,响应于所述静态数据流分析期间或所述控制流分析期间存在无法确定内存开销表达式的被调用内存分配函数,为该被调用内存分配函数单独实现内存预留。
[0020]可选地,在上述方面的一个示例中,所述函数调用图、所述函数数值流图以及所述函数控制流图基于所述计算机程序经过编译后得到的中间表示构建,所述中间表示包括与内存分配相关的所有信息,并且每个变量满足单一静态赋值形式。
[0021]可选地,在上述方面的一本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种用于计算机程序的内存耗尽处理的方法,包括:对计算机程序中的需要进行内存预留处理的目标内存分配函数进行内存开销分析,得到所述目标内存分配函数的内存开销表达式;在所述计算机程序的预编译期间,经由过程宏读取所述目标内存分配函数的内存开销表达式,并根据所述内存开销表达式进行过程宏展开以生成内存预留语句,所述内存预留语句包括内存预留值计算语句和内存预留功能API调用语句;以及对经过过程宏展开后的计算机程序进行后续编译,得到所述计算机程序的可执行文件。2.如权利要求1所述的方法,还包括:响应于所述计算机程序的可执行文本被执行,经由所述内存预留语句调用代理内存分配器来为所述目标内存分配函数实现内存预留,所述代理内存分配器在所述过程宏中被声明为全局内存分配器。3.如权利要求2所述的方法,其中,所述代理内存分配器具有默认内存分配器的引用能力。4.如权利要求1所述的方法,其中,对计算机程序中的需要进行内存预留处理的目标内存分配函数进行内存开销分析,得到所述目标内存分配函数的内存开销表达式包括:对计算机程序中的需要进行内存预留处理的目标内存分配函数进行基于静态分析的内存开销分析,得到所述目标内存分配函数的内存开销表达式。5.如权利要求4所述的方法,其中,对计算机程序中的需要进行内存预留处理的目标内存分配函数进行基于静态分析的内存开销分析,得到所述目标内存分配函数的内存开销表达式包括:根据所述计算机程序的函数调用图,通过函数调用链遍历来自底向上查找出所有目标内存分配函数;针对每个目标内存分配函数,获取该目标内存分配函数所调用的内存分配函数的内存开销表达式;针对该目标内存分配函数的每个内存分配函数调用,使用基于计算机程序的函数数值流图的静态数值流分析获取该内存分配函数调用的传入参数的内存开销表达式,并对所对应的内存分配函数的内存开销表达式中的传入参数进行表达式替换,得到该内存分配函数调用的内存开销表达式;以及使用基于所述计算机程序的函数控制流图的控制流分析,对该目标内存分配函数内的所有内存分配函数调用的内存开销表达式进行整合,得到该目标内存分配函数的内存开销表达式。6.如权利要求5所述的方法,其中,针对该目标内存分配函数的每个内存分配函数调用,使用基于所述计算机程序的数值流图的静态数值流分析获取该内存分配函数调用的传入参数的内存开销表达式包括:针对每个传入参数,自该传入参数对应的目标结点起进行深度优先搜索直到到达终止结点,以在所述函数数值流图中查找该传入参数的关联结点,并基于所查找到的关联结点,自终止结点起递归地生成该传入参数的内存开销表达式。7.如权利要求6所述的方法,其中,所查找到的每个结点的内存开销表达式经由给定语
法解析器来根据该结点的结点类型进行操作和语法解析来递归生成。8.如权利要求5所述的方法,其中,针对传入参数的静态数值流分析包括过程间分析,以及在构建所述函数数值流图时,为每个函数调用结点和参数结点的传入边分配调用ID,同一函数调用点的调用ID相同,并且在所述过程间分析时维护用于记录调用ID的函数调用栈以实现函数调用点区分。9.如权利要求5所述的方法,其中,针对传入参数的静态数值流分析包括域敏感分析,并且在所述域敏感分析时维护用于记录域信息的域信息栈,所述域信息用于指示目标值在变量结构体中的域索引。10.如权利要求9所述的方法,其中,所述域信息采用目标值在所述变量结构体中的偏移量和实际大小表征。11.如权利要求5所述的方法,其中,所述基于所述计算机程序的函数控制流图的控制流分析包括采用基于处理队列的拓扑序遍历的控制流分析,所述处理队列中的基本块采取先进先出处理策略。12.如权利要求11所述的方法,其中,所述函数控制流图中的强连通分量被整体处理为强连通分量基本块,以及强连通分量的所有入边和出边作为对应强连通分量基本块的入边和出边。13.如权利要求12所述的方法,其中,所述基于处理队列的拓扑序遍历的控制流分析包括:获取当前基本块的所有后续基本块;针对每个后续基本块,响应于该后续基本块为强连通分量基本块,跳转到该后续基本块执行后续处理;响应于该后续基本块的入度大于1,对所述当前基本块和该后续基本块的内存开销表达式进行合并处理...

【专利技术属性】
技术研发人员:陈澄钧张志淙田洪亮闫守孟徐辉
申请(专利权)人:支付宝杭州信息技术有限公司
类型:发明
国别省市:

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

1