CN114238086A - 内存泄露检测方法、装置、计算机设备和存储介质 - Google Patents
内存泄露检测方法、装置、计算机设备和存储介质 Download PDFInfo
- Publication number
- CN114238086A CN114238086A CN202111455500.0A CN202111455500A CN114238086A CN 114238086 A CN114238086 A CN 114238086A CN 202111455500 A CN202111455500 A CN 202111455500A CN 114238086 A CN114238086 A CN 114238086A
- Authority
- CN
- China
- Prior art keywords
- node
- hash table
- code
- memory
- detected
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/362—Software debugging
- G06F11/3636—Software debugging by tracing the execution of the program
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Storage Device Security (AREA)
Abstract
本申请涉及一种内存泄露检测方法、装置、计算机设备、存储介质和计算机程序产品。方法包括:获取与内存操作对应的待检测代码;生成与待检测代码对应的控制流图,并根据控制流图确定出节点路径;依据代码指令与哈希表操作的对应关系,依次对节点路径中的各节点的代码指令执行对应的哈希表操作,并更新哈希表状态;根据执行完成的节点路径对应的哈希表状态,确定待检测代码中是否存在内存泄露。采用本方法能够在不运行待检测代码的情况下,检测出待检测代码是否存在内存泄露,因此能够节省运行成本。
Description
技术领域
本申请涉及智能电网技术领域,特别是涉及一种内存泄露检测方法、装置、计算机设备、存储介质和计算机程序产品。
背景技术
近年来,智能电网技术的快速发展,为保障智能电网的可靠稳定运行,需要保障智能电网中的代码指令的准确可靠性。代码指令的异常之一为代码指令中出现内存泄露的情况。内存泄漏指的是代码指令动态申请内存,在内存使用完之后释放不及时、没有释放或者错误释放,导致这部分内存没有被系统回收,即造成内存泄露。基于智能电网系统的用户访问量大、持续性强等特点,随着智能电网中软件的运行、用户持续访问的情况,内存泄漏不断累积,消耗的系统资源无法重新利用,导致程序内存不断增大,系统内存不足,从而影响智能电网的正常运行:轻则导致用户访问智能电网时发生延迟、异常的情况,严重时将导致智能电网的系统崩溃。内存泄漏并不是一个显式错误,也就是说编程人员不能直接通过代码形式检查发现内存泄露的问题。针对智能电网中的内存泄露问题,目前的技术方案一般是在从智能电网的数据流中获取与内存操作对应的待检测代码后,运行待检测代码,根据待检测代码的运行结果来判断待检测代码是否存在内存泄露的问题。但是,目前的技术方案中,针对不同的待检测代码都需要进行运行检测,需要消耗大量的运行成本。
因此,如何在内存泄露检测过程中,降低运行成本的消耗,是本领域技术人员目前需要解决的技术问题。
发明内容
基于此,有必要针对上述技术问题,提供一种能够降低运行成本的消耗的内存泄露检测方法、装置、计算机设备、计算机可读存储介质和计算机程序产品。
第一方面,本申请提供了一种内存泄露检测方法,所述方法包括:
获取与内存操作对应的待检测代码;
生成与所述待检测代码对应的控制流图,并根据所述控制流图确定出节点路径;
依据代码指令与哈希表操作的对应关系,依次对所述节点路径中的各节点的代码指令执行对应的哈希表操作,并更新哈希表状态;
根据执行完成的所述节点路径对应的哈希表状态,确定所述待检测代码中是否存在内存泄露。
在其中一个实施例中,所述依据代码指令与哈希表操作的对应关系,依次对所述节点路径中的各节点的代码指令执行对应的哈希表操作,并更新哈希表状态,包括:
将所述控制流图中的各所述节点路径输入至中间模型;
利用所述中间模型解析各所述节点,并将各所述节点按照所述控制流图的形式转存至所述中间模型中;
通过所述中间模型依次调用所述节点路径中的各所述节点,依据所述代码指令与所述哈希表操作的对应关系,对各所述节点的所述代码指令执行对应的哈希表操作,并更新所述哈希表状态。
在其中一个实施例中,所述通过所述中间模型依次调用所述节点路径中的各所述节点,依据所述代码指令与所述哈希表操作的对应关系,对各所述节点的所述代码指令执行对应的哈希表操作,并更新所述哈希表状态,包括:
通过所述中间模型依次调用所述节点路径中的各所述节点;
依据所述代码指令与所述哈希表操作的对应关系,确定出所述节点的代码指令对应的哈希表操作;
根据所述哈希表操作以及指针与内存块的映射关系,更新所述哈希表状态。
在其中一个实施例中,所述生成与所述待检测代码对应的控制流图,并根据所述控制流图确定出节点路径,包括:
根据所述待检测代码中的流程关系确定节点和控制流线,并根据所述节点和所述控制流线确定出所述控制流图;
利用所述控制流图中起始节点和结束节点之间的节点和控制流线,确定出所述节点路径。
在其中一个实施例中,所述控制流图中的每个所述节点中的信息包括节点号、所述节点对应的代码指令所在行数、所述节点对应的代码指令的内容以及所述节点的后继节点的节点号。
在其中一个实施例中,所述方法还包括:
根据所述哈希表状态的异常数据和所述哈希表操作确定出异常操作语句;
根据所述异常操作语句确定出所述待检测代码中存在内存泄露的代码指令位置。
第二方面,本申请还提供了一种内存泄露检测装置,所述装置包括:
获取模块,用于获取与内存操作对应的待检测代码;
确定模块,用于生成与所述待检测代码对应的控制流图,并根据所述控制流图确定出节点路径;
操作模块,用于依据代码指令与哈希表操作的对应关系,依次对所述节点路径中的各节点的代码指令执行对应的哈希表操作,并更新哈希表状态;
检测模块,用于根据执行完成的所述节点路径对应的哈希表状态,确定所述待检测代码中是否存在内存泄露。
第三方面,本申请还提供了一种计算机设备。所述计算机设备包括存储器和处理器,所述存储器存储有计算机程序,所述处理器执行所述计算机程序时实现以下步骤:
第四方面,本申请还提供了一种计算机可读存储介质。所述计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现以下步骤:
获取与内存操作对应的待检测代码;
生成与所述待检测代码对应的控制流图,并根据所述控制流图确定出节点路径;
依据代码指令与哈希表操作的对应关系,依次对所述节点路径中的各节点的代码指令执行对应的哈希表操作,并更新哈希表状态;
根据执行完成的所述节点路径对应的哈希表状态,确定所述待检测代码中是否存在内存泄露。
第五方面,本申请还提供了一种计算机程序产品。所述计算机程序产品,包括计算机程序,该计算机程序被处理器执行时实现以下步骤:
获取与内存操作对应的待检测代码;
生成与所述待检测代码对应的控制流图,并根据所述控制流图确定出节点路径;
依据代码指令与哈希表操作的对应关系,依次对所述节点路径中的各节点的代码指令执行对应的哈希表操作,并更新哈希表状态;
根据执行完成的所述节点路径对应的哈希表状态,确定所述待检测代码中是否存在内存泄露。
上述内存泄露检测方法、装置、计算机设备、存储介质和计算机程序产品,本方法依据预设的代码指令与哈希表操作的对应关系,通过哈希表操作来模拟与待检测代码对应的控制流图中节点路径的内存操作,并更新哈希表状态,根据执行完成的节点路径对应的哈希表状态,确定待检测代码中是否存在内存泄露;因此本方法能够在不运行待检测代码的情况下,检测出待检测代码是否存在内存泄露,因此能够节省运行成本。
附图说明
图1为一个实施例中内存泄露检测方法的流程示意图;
图2a至图2c为另一个实施例中内存泄露检测方法的流程示意图;
图3为另一个实施例中内存泄露检测方法的流程示意图;
图4为一个实施例中内存泄露检测装置的结构框图;
图5为一个实施例中计算机设备的内部结构图。
具体实施方式
为了使本申请的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本申请进行进一步详细说明。应当理解,此处描述的具体实施例仅仅用以解释本申请,并不用于限定本申请。
在一个实施例中,如图1所示,提供了一种内存泄露检测方法,本实施例以该方法应用于终端进行举例说明,可以理解的是,该方法也可以应用于服务器,还可以应用于包括终端和服务器的系统,并通过终端和服务器的交互实现。本实施例中,该方法包括以下步骤:
步骤102,获取与内存操作对应的待检测代码。
具体的,在实际操作中,一般是从待检测系统的数据流中获取待检测代码,通过对待检测代码进行内存泄露检测操作,以确定出待检测系统是否存在内存泄露的风险。本实施例对待检测系统的具体类型不做限定,例如可以是智能电网,也可以是其他通过代码指令进行内存控制的系统。其中,数据流指的是一组有序的、有起点和终点的数据序列,应用在程序设计领域指的是在程序运行过程中流动的数据。数据流分析表示的是根据程序执行过程中流动的数据信息进行分析,推导程序实际运行的过程。数据流分析通常用来在程序没有运行时静态分析源代码,以预测程序动态运行时的过程。
本实施例的重点在于对内存泄露进行检测,因此需要从数据流中获取与内存操作对应的待检测代码。在实际操作中,在对待检测代码进行分析之前,一般会进一步对待检测代码进行预处理操作。预处理是对待检测代码进行静态分析的基础,通过对待检测代码的预处理,提取此次分析需要的信息,并采用合适的数据结构来存储,在能够降低后续分析的难度的同时也极大地提高了分析的效率。另外需要说明的是,本实施例对代码指令的具体类型不做限定,例如可以是C++程序语言的代码指令。
步骤104,生成与待检测代码对应的控制流图,并根据控制流图确定出节点路径。
具体的,控制流图(Control Flow Graph,CFG)也叫控制流程图,控制流图是进行程序分析和源代码结构分析的重要数据结构之一,是一个过程或程序的抽象表现,是用在编译器中的一个抽象数据结构,由编译器在内部维护,代表了一个程序执行过程中会遍历到的所有路径。它用图的形式表示一个过程内所有基本块执行的可能流向,也能反映一个过程的实时执行过程;也就是说,数据流是沿着控制流图中程序的执行路径流动的。
在实际操作中,在获取待检测代码后,将待检测代码转换为对应的控制流图。可以理解的是,由于待检测代码中可能存在选择结构、循环结构以及多分支结构等情况,因此控制流图中可能包括多条路径,即存在多条从起始节点到结束节点的不同路径,因此需要确定出各不同的节点路径。
步骤106,依据代码指令与哈希表操作的对应关系,依次对节点路径中的各节点的代码指令执行对应的哈希表操作,并更新哈希表状态;
步骤108,根据执行完成的节点路径对应的哈希表状态,确定待检测代码中是否存在内存泄露。
具体的,预先设置代码指令与哈希表操作的对应关系,在需要执行与节点路径对应的内存操作时,针对每一条节点路径,依次获取节点路径中的节点,再依据代码指令与哈希表操作的对应关系,通过哈希表操作模拟节点中的代码指令对内存的操作,例如分配、释放堆内存等,根据哈希表操作更新哈希表状态,因此哈希表状态模拟的对应为内存状态。
可以理解的是,在一条节点路径对应的所有节点的内存操作都执行完毕后,此时的哈希表状态即表示这一节点路径对应的内存操作结束时的内存状态;因此可以通过检测哈希表状态,确定待检测代码中是否存在内存泄露。具体的,若最终的哈希表状态中存在没有指针指示的内存,即表示该内存在使用完后没有被释放,因此可以确定待检测代码中存在内存泄露的问题。
上述内存泄露检测方法中,依据预设的代码指令与哈希表操作的对应关系,通过哈希表操作来模拟与待检测代码对应的控制流图中节点路径的内存操作,并更新哈希表状态,根据执行完成的节点路径对应的哈希表状态,确定待检测代码中是否存在内存泄露;因此本方法能够在不运行待检测代码的情况下,检测出待检测代码是否存在内存泄露,因此能够节省运行成本。
在上述实施例的基础上,本实施例对技术方案作了进一步的说明和优化,具体的,本实施例中,依据代码指令与哈希表操作的对应关系,依次对节点路径中的各节点的代码指令执行对应的哈希表操作,并更新哈希表状态,包括:
将控制流图中的各节点路径输入至中间模型;
利用中间模型解析各节点,并将各节点按照控制流图的形式转存至中间模型中;
通过中间模型依次调用节点路径中的各节点,依据代码指令与哈希表操作的对应关系,对各节点的代码指令执行对应的哈希表操作,并更新哈希表状态。
需要说明的是,在根据待检测代码生成对应的控制流图后,控制流图的信息并不能直接被利用,本实施例通过中间模型来存储控制流图,以方便后续对控制流图进行处理。具体的,在本实施例中,是在根据控制流图确定出节点路径后,以节点路径的形式将控制流图输入至中间模型;然后利用中间模型解析各节点,并将各节点按照控制流图的形式转存至中间模型中。
作为一种优选的实施方式,本实施例选择利用XML(eXtensible MarkupLanguage,可扩展的标识语言)解析模型作为中间模型,利用XML解析模型中的TinyXML开源库对节点路径中的各节点进行解析,主要原因是TinyXML开源库的基础是DOM(DocumentObject Model,文档对象模型),这种树结构模型在易于理解的同时,也为用户提供了用于访问的面向对象接口。作为一种基于DOM的解析工具,TinyXML开源库的原理是:一次性加载XML文件,利用TiXmlDocument类将待解析的XML文件加载到内存中,以便后续的操作;获取节点,对节点内容进行解析,从解析声明开始,将每一个节点作为对象存入树结构中,并且保持节点之间的关系;通过提供的面向对象接口,用户可以方便通过调用接口的方式访问和编辑XML文件中的数据。通过将各节点路径存储至中间模型中,因此能够通过中间模型依次调用节点路径中的各节点,再依据代码指令与哈希表操作的对应关系,对各节点的代码指令执行对应的哈希表操作,并更新哈希表状态。
可见,中间模型在能够完整地存储每个节点的信息的前提下,还能体现节点之间的关系,即能够以节点路径的形式存储接节点,同时,能够便捷地通过接口调用的方式对节点执行相应的操作,方便解析、读取,能够增强内存泄露检测方法的拓展性和适应性。
在上述实施例的基础上,本实施例对技术方案作了进一步的说明和优化,具体的,本实施例中,生成与待检测代码对应的控制流图,并根据控制流图确定出节点路径,包括:
根据待检测代码中的流程关系确定节点和控制流线,并根据节点和控制流线确定出控制流图;
利用控制流图中起始节点和结束节点之间的节点和控制流线,确定出节点路径。
具体的,在获取到待检测代码后,首先对待检测代码进行语义识别,识别出待检测代码中的每一个词,并删除空白符、注释、不完整的括号等无效字符,并在检测出语法错误时,修正语法错误。在实际操作中,这一过程可以通过生成与待检测代码对应的抽象语法树实现。抽象语法树(abstract syntax code,AST)是源代码抽象语法结构的树状表示,树上的每个节点都表示源代码中的一种语法结构;节点可以是操作符或者自定义变量,但是表示语法结构的节点是抽象的,也就是说并不会完全和源代码相同,它会隐藏一些细节,比如嵌套结构的括号,并不会出现在抽象语法树中,也就是说抽象语法树具有“抽象性”。抽象语法树作为语法分析和后端的接口,通过将待检测代码转换为抽象语法树,确定出待检测代码中的无效字符如空白符、注释、不完整的括号等,以及检测出待检测代码中的语法错误,通过删除无效字符,修正语法错误,得出更新后的待检测代码,后续继续更新后的待检测代码执行操作,能够进一步提高检测的准确度。
在实际操作中,在得到更新后的待检测代码后,可以根据待检测代码中的流程关系确定节点和控制流线,并根据节点和控制流线确定出控制流图。其中,根据待检测代码中的代码指令的结构,确定节点与控制流线,结构包括顺序结构,if分支结构如if、if…else…、if…else if…else…等;循环结构如for循环、while循环、do…while循环、until循环等,以及Case多分支结构;其中,节点以标有编号的圆圈表示,表示基本的程序块,可以是一个单独的语句,也可以是多个顺序执行的语句块;控制流线用带箭头的弧线表示,连接相关的两个节点,且每个控制流线可以标有名字(也可以不标),但必须终止于某一节点。
在实际操作中,也可以先根据待检测代码的流程关系确定出对应的程序流程图,再根据程序流程图确定出控制流图。如图2a所示,为本发明实施例提供的一种待检测代码的示意图,图2b为根据图2a所示的待检测代码确定出的程序流程图,对程序流程图进行简化,得到更加突出控制流结构的控制流图,如图2c所示。更具体的,结合图2b和图2c可以更清楚地区分程序流程图和控制流图之间的区别:程序流程图采用统一规定的符号描述程序执行过程,通常由起始框、结束框、处理框、判断框以及流程线组成,反映了程序运行的具体步骤,着重表现程序的逻辑性,结构清晰。控制流图通常表示的是程序的逻辑控制流程的有向图,由节点集合和有向边的集合组成,记为CFG(V,E);其中,V是控制流图的节点的集合,V={Vs,V1,V2......Vn},表示的是简单语句、判定语句或者控制流交汇点,Vs和Vn分别是控制流图的起始节点和结束节点;E是控制流图的有向边的集合,E={E1,E2......En},实际上表示的是节点与节点之间的关系,E=<Vm,Vm+1>,Vm,是前驱节点,Vm+1是后继节点。控制流图相较于程序流程图而言,更为简洁,只需要节点和控制流线表示即可。
可以理解的是,根据代码指令的多种类型的结构,节点之间可能有多种连接方式,因此利用控制流图中起始节点和结束节点之间的节点和控制流线,确定出节点路径。也就是说,控制流图记录的是程序所有可能的执行路径,程序实际运行时执行的路径会根据赋值的不同而不同。例如,如图2c中,包括3条节点路径,第一条节点路径为“5-8-12-14-15-16-21-5”,第二条节点路径为“5-8-12-14-15-18-21-5”,第三条节点路径为“5-8-24”。
作为一种优选的实施方式,控制流图中的每个节点中的信息包括节点号、节点对应的代码指令所在行数、节点对应的代码指令的内容以及节点的后继节点的节点号。
具体的,在本实施例中,控制流图的每个节点node定义为一个形式化的四元组<id,line,cont,nextNode>;其中,id表示的是控制流图中节点的节点号,即节点号用于唯一标识各节点;line表示的是节点对应的内存操作的代码指令在整个代码指令中所在的行数,作用是精准报告待检测代码中发生内存泄漏的位置;cont(content)表示的是与节点对应的代码指令的内容,与节点对应的内存操作相关的指令代码,忽略与内存泄露无关,也就是与内存操作无关的语句信息;nextNode表示的是与节点对应的后继节点的节点号(id),既用于表示控制流图中节点的连接,又方便后续将控制流图存储至中间模型中。
本实施例通过按照统一的格式规范设置每一个节点的信息,以便于对各节点进行管理,同时便于将节点存储至中间模型中,在能够提高检测效率的同时,降低内存泄露检测方法的实现难度。
对应的,在将控制流图存储至中间模型时,在中间模型中将标签设置为节点号(id),line、cont和nextNode则是每个标签下的三个属性,按照这样的方式在中间模型中存储控制流图,既可以完整地保存每个节点的信息,又可以保持控制流图的结构,方便读取。
在上述实施例的基础上,本实施例对技术方案作了进一步的说明和优化,具体的,本实施例中,通过中间模型依次调用节点路径中的各节点,依据代码指令与哈希表操作的对应关系,对各节点的代码指令执行对应的哈希表操作,并更新哈希表状态,包括:
通过中间模型依次调用节点路径中的各节点;
依据代码指令与哈希表操作的对应关系,确定出节点的代码指令对应的哈希表操作;
根据哈希表操作以及指针与内存块的映射关系,更新哈希表状态。
具体的,哈希表存储的是键值对<key,value>,键值对定义了一种映射关系,即Hash函数,采用Hash函数可以根据关键字key快速找到存储的记录,即只需要根据关键字和Hash函数就可以查找到对应的值。本实施例以C++程序语言的代码指令为例进行说明,C++程序语言作为一种高效、灵活的编程语言,更接近操作系统底层,能方便地部署到操作系统、图形处理、搜索引擎以及数据库中,兼容性良好;且C++程序语言保留了指针、动态内存分配等特性,通过指针能够直接找到内存位置,从而对该位置的数据进行操作,不用通过变量名寻址,极大地节约了时间开销;允许用户通过代码指令直接对系统资源进行控制,通过指针进行内存的动态分配,做到申请即用,如分配和释放内存;例如,可以通过new语句动态分配内存,在分配的内存使用完毕后,通过delete语句释放内存。
在代码指令中,通过指针进行内存操作,定义指针变量为pointer,指针变量保存的地址指向内存块M,并且在C++程序语言中,允许多个指针保存的相同的内存地址,也就是多个指针指向同一个内存块,定义指向同一内存块Mi的指针集合为P。即,指针与内存块之间存在两种映射关系:
一个指针与其指向的内存块之间的映射:指针pointer和内存块M是多对一的映射;
指向同一内存块的指针集合与内存块之间的映射:属于同一指针集合的指针指向的是同一个内存块,所以指针集合与内存块之间的映射是一对一的映射。
在实际操作中,为了能够利用哈希表操作模拟待检测代码中的代码指令的内存操作,如内存分配、内存释放等,根据哈希表的存储特点和指针的操作特点,以及键值对的映射关系,确定出代码指令与哈希表操作的对应关系,即利用哈希表中的<key,value>表示数据单元<pointer,M>,如表1所示,为本发明实施例提供的一种内存操作、代码指令与Hash函数的对应关系表;
表1内存操作、代码指令与Hash函数的对应关系表
内存操作 | C++代码指令 | Hash函数 |
分配内存 | int*P=new int[5] | Add(pointer,M) |
释放内存 | delete[]P | Delete(pointer,M) |
查询内存 | int a=P[1] | Get(pointer) |
修改指针 | int*Q=P | Modify(pointer,M) |
需要说明的是,C++程序语言中的常见的内存操作有增(Add)、删(Delete)、查(Get)、改(Modify),这也可以对应于哈希表中的操作,利用哈希表操作模拟C++程序中的内存操作,对哈希表有四种操作定义:
1、Add:Add(pointer,M)是指针pointer分配一块动态内存M,对应的哈希表操作是将键值对<pointer,M>加入到哈希表中;
2、Delete:Delete(pointer,M)是在动态内存区中释放已经被指针pointer分配的内存块M,对应的哈希表操作是找到键值对<pointer,M>,并删除该键值对;
3、Get:Get(pointer)是C++程序中返回指针pointer指向的内存块的首地址,对应的哈希表操作是在哈希表中查找键值为pointer的M;
4、Modify:Modify(pointer,Mi)是修改指针pointer指向的地址,从原来指向的M修改为Mi,对应的哈希表操作是查找键值为pointer的键值对并将其value修改为Mi。
在将节点路径存储至中间模型中后,通过中间模型依次调用节点路径中的各节点;针对每一个调用的节点,依据代码指令与哈希表操作的对应关系,确定出节点的代码指令对应的哈希表操作;根据哈希表操作以及指针与内存块的映射关系,更新哈希表状态。
例如,假设一条节点路径包括四个节点,且各节点表示如下:
Node1:<1,37,“p=malloc(sizeof(int));”,2>
Node2:<2,38,“q=malloc(sizeof(int));”,3>
Node3:<3,39,“p=q;”,4>
Node4:<4,40,“free(p);”,null>
依据代码指令与哈希表操作的对应关系,确定出节点的代码指令对应的哈希表操作;如代码指令“p=malloc(sizeof(int));”对应的哈希表操作为“Add(p,M1)”,代码指令“p=q;”对应的哈希表操作为“Modify(p,M2)”;然后根据哈希表操作以及指针与内存块的映射关系,更新哈希表状态。哈希表操作的处理过程如表2所示:
表2哈希表操作的处理过程
在节点路径对应的节点的代码指令都执行完毕后,确定出哈希表状态,根据处理完成的哈希表状态确定与该节点路径对应的待检测代码中是否存在内存泄漏风险。
具体的,在根据指令代码对哈希表执行对应的哈希表作之后,若哈希表状态中存在如<null,M1>的指针与内存块的映射关系,则表明该待检测代码中存在内存泄漏的风险。
可见,本实施例根据哈希表操作以及指针与内存块的映射关系,更新哈希表状态,因此能够根据哈希表状态确定待检测代码中是否存在内存泄露的情况,检测过程便捷,检测结果直观;另外,本实施例通过指针能直接找到内存位置,从而对该位置数据进行操作,不用通过变量名寻址,极大节约了时间开销。
在上述实施例的基础上,本实施例对技术方案作了进一步的说明和优化,具体的,本实施例中,方法还包括:
根据哈希表状态的异常数据和哈希表操作确定出异常操作语句;
根据异常操作语句确定出待检测代码中存在内存泄露的代码指令位置。
在本实施例中,在根据哈希表状态确定出待检测代码中存在内存泄露风险之后,获取哈希表状态中的异常数据,如上表2所示,根据哈希表状态中的异常数据“(<NULL,M1>)”确定待检测代码中存在内存泄露风险,根据异常数据“(<NULL,M1>)”确定出对应的指令代码,并且可以确定出该指令代码对应的节点为“Node4”,再根据节点“Node4”中所包含的信息“节点对应的代码指令所在行数”,确定出存在内存泄露的代码指令所在行数。
需要说明的是,在其他实施例中,也可以在根据哈希表状态确定出待检测代码中存在内存泄露风险之后,利用第三方软件对待检测代码进行检测,确定出待检测代码中存在内存泄露的代码指令所在行数。其中,第三方软件可以是cppcheck等开源工具,本实施例对第三方软件的具体类型不做限定。
可见,本实施例在能够检测出内存泄露风险的基础上,能够进一步确定出待检测代码中存在内存泄露风险的代码所在行数,即确定出存在内存泄露的代码指令位置,因此能够进一步便于用户根据确定出的存在内存泄露的代码指令位置对待检测代码进行修改。
为了使本技术领域的人员更好地理解本申请中的技术方案,下面结合实际应用场景对本申请实施例中的技术方案进行详细说明。如图3所示,为本实施例提供的一种内存泄露检测方法的流程示意图;本申请实施例以对智能电网中的待检测数据进行内存泄露检测为例,具体步骤如下:
步骤302:从智能电网的数据流中获取与内存操作对应的待检测代码;
其中,智能电网就是电网的智能化,也被称为“电网2.0”,是建立在集成的、高速双向通信网络的基础上,通过先进的传感和测量技术、先进的设备技术、先进的控制方法以及先进的决策支持系统技术的应用,实现电网的可靠、安全、经济、高效、环境友好和使用安全的目标,其主要特征包括自愈、激励和保护用户、抵御攻击、提供满足用户需求的电能质量、容许各种不同发电形式的接入、启动电力市场以及资产的优化高效运行。
步骤304:对待检测代码进行词法、语法分析,得到抽象语法树,删除待检测代码中的无效字符,修正语法错误,更新待检测代码;
步骤306:根据更新后的待检测代码中的流程关系确定节点和控制流线,并根据节点和控制流线确定出控制流图;
步骤308:利用控制流图中起始节点和结束节点之间的节点和控制流线,确定出节点路径;
步骤310:将控制流图中的各节点路径输入至XML解析模型;
步骤312:利用XML解析模型中的TinyXML开源库解析各节点,并将各节点按照控制流图的形式转存至XML解析模型中;
步骤314:通过中间模型依次调用节点路径中的各节点;
步骤316:依据代码指令与哈希表操作的对应关系,确定出节点的代码指令对应的哈希表操作;
步骤318:根据哈希表操作以及指针与内存块的映射关系,更新哈希表状态;
步骤320:根据执行完成的节点路径对应的哈希表状态,确定待检测代码中是否存在内存泄露;
步骤322:根据哈希表状态的异常数据和哈希表操作确定出异常操作语句;
步骤324:根据异常操作语句确定出待检测代码中存在内存泄露的代码指令位置。
需要说明的是,本实施例中的各步骤的具体解释可以参考上述实施例中对各步骤的解释说明,此处不做赘述。
本实施例提供的内存泄露检测方法,依据预设的代码指令与哈希表操作的对应关系,通过哈希表操作来模拟与待检测代码对应的控制流图中节点路径的内存操作,并更新哈希表状态,根据执行完成的节点路径对应的哈希表状态,确定待检测代码中是否存在内存泄露;因此本方法能够在不运行待检测代码的情况下,检测出待检测代码是否存在内存泄露,因此能够节省运行成本;并且能够进一步确定出待检测代码中存在内存泄露风险的代码所在行数,即确定出存在内存泄露的代码指令位置,因此能够进一步便于用户根据确定出的存在内存泄露的代码指令位置对待检测代码进行修改。
应该理解的是,虽然如上的各实施例所涉及的流程图中的各个步骤按照箭头的指示依次显示,但是这些步骤并不是必然按照箭头指示的顺序依次执行。除非本文中有明确的说明,这些步骤的执行并没有严格的顺序限制,这些步骤可以以其它的顺序执行。而且,如上的各实施例所涉及的流程图中的至少一部分步骤可以包括多个步骤或者多个阶段,这些步骤或者阶段并不必然是在同一时刻执行完成,而是可以在不同的时刻执行,这些步骤或者阶段的执行顺序也不必然是依次进行,而是可以与其它步骤或者其它步骤中的步骤或者阶段的至少一部分轮流或者交替地执行。
基于同样的发明构思,本申请实施例还提供了一种用于实现上述所涉及的内存泄露检测方法的内存泄露检测装置。该装置所提供的解决问题的实现方案与上述方法中所记载的实现方案相似,故下面所提供的一个或多个内存泄露检测装置实施例中的具体限定可以参见上文中对于内存泄露检测方法的限定,在此不再赘述。
在一个实施例中,如图4所示,提供了一种内存泄露检测装置,包括:获取模块402、确定模块404、操作模块406和检测模块408,其中:
获取模块402,用于获取与内存操作对应的待检测代码;
确定模块404,用于生成与待检测代码对应的控制流图,并根据控制流图确定出节点路径;
操作模块406,用于依据代码指令与哈希表操作的对应关系,依次对节点路径中的各节点的代码指令执行对应的哈希表操作,并更新哈希表状态;
检测模块408,用于根据执行完成的节点路径对应的哈希表状态,确定待检测代码中是否存在内存泄露。
本发明实施例提供的一种内存泄露检测装置,具有与上述一种内存泄露检测方法相同的有益效果。
在其中一个实施例中,操作模块包括:
输入子模块,用于将控制流图中的各节点路径输入至中间模型;
存储子模块,用于利用中间模型解析各节点,并将各节点按照控制流图的形式转存至中间模型中;
更新子模块,用于通过中间模型依次调用节点路径中的各节点,依据代码指令与哈希表操作的对应关系,对各节点的代码指令执行对应的哈希表操作,并更新哈希表状态。
在其中一个实施例中,更新子模块包括:
调用单元,用于通过中间模型依次调用节点路径中的各节点;
确定单元,用于依据代码指令与哈希表操作的对应关系,确定出节点的代码指令对应的哈希表操作;
更新单元,用于根据哈希表操作以及指针与内存块的映射关系,更新哈希表状态。
在其中一个实施例中,确定模块包括:
第一确定子模块,用于根据待检测代码中的流程关系确定节点和控制流线,并根据节点和控制流线确定出控制流图;
第二确定子模块,用于利用控制流图中起始节点和结束节点之间的节点和控制流线,确定出节点路径。
在其中一个实施例中,内存泄露检测装置还包括:
异常语句确定模块,用于根据哈希表状态的异常数据和哈希表操作确定出异常操作语句;
异常位置确定模块,用于根据异常操作语句确定出待检测代码中存在内存泄露的代码指令位置。
上述内存泄露检测装置中的各个模块可全部或部分通过软件、硬件及其组合来实现。上述各模块可以硬件形式内嵌于或独立于计算机设备中的处理器中,也可以以软件形式存储于计算机设备中的存储器中,以便于处理器调用执行以上各个模块对应的操作。
在一个实施例中,提供了一种计算机设备,该计算机设备可以是终端,其内部结构图可以如图5所示。该计算机设备包括通过系统总线连接的处理器、存储器、通信接口、显示屏和输入装置。其中,该计算机设备的处理器用于提供计算和控制能力。该计算机设备的存储器包括非易失性存储介质、内存储器。该非易失性存储介质存储有操作系统和计算机程序。该内存储器为非易失性存储介质中的操作系统和计算机程序的运行提供环境。该计算机设备的通信接口用于与外部的终端进行有线或无线方式的通信,无线方式可通过WIFI、移动蜂窝网络、NFC(近场通信)或其他技术实现。该计算机程序被处理器执行时以实现一种内存泄露检测方法。该计算机设备的显示屏可以是液晶显示屏或者电子墨水显示屏,该计算机设备的输入装置可以是显示屏上覆盖的触摸层,也可以是计算机设备外壳上设置的按键、轨迹球或触控板,还可以是外接的键盘、触控板或鼠标等。
本领域技术人员可以理解,图5中示出的结构,仅仅是与本申请方案相关的部分结构的框图,并不构成对本申请方案所应用于其上的计算机设备的限定,具体的计算机设备可以包括比图中所示更多或更少的部件,或者组合某些部件,或者具有不同的部件布置。
在一个实施例中,提供了一种计算机设备,包括存储器和处理器,存储器中存储有计算机程序,该处理器执行计算机程序时实现以下步骤:
获取与内存操作对应的待检测代码;
生成与待检测代码对应的控制流图,并根据控制流图确定出节点路径;
依据代码指令与哈希表操作的对应关系,依次对节点路径中的各节点的代码指令执行对应的哈希表操作,并更新哈希表状态;
根据执行完成的节点路径对应的哈希表状态,确定待检测代码中是否存在内存泄露。
本发明实施例提供的一种计算机设备,具有与上述一种内存泄露检测方法相同的有益效果。
在一个实施例中,提供了一种计算机可读存储介质,其上存储有计算机程序,计算机程序被处理器执行时实现以下步骤:
获取与内存操作对应的待检测代码;
生成与待检测代码对应的控制流图,并根据控制流图确定出节点路径;
依据代码指令与哈希表操作的对应关系,依次对节点路径中的各节点的代码指令执行对应的哈希表操作,并更新哈希表状态;
根据执行完成的节点路径对应的哈希表状态,确定待检测代码中是否存在内存泄露。
本发明实施例提供的一种计算机可读存储介质,具有与上述一种内存泄露检测方法相同的有益效果。
在一个实施例中,提供了一种计算机程序产品,包括计算机程序,该计算机程序被处理器执行时实现以下步骤:
获取与内存操作对应的待检测代码;
生成与待检测代码对应的控制流图,并根据控制流图确定出节点路径;
依据代码指令与哈希表操作的对应关系,依次对节点路径中的各节点的代码指令执行对应的哈希表操作,并更新哈希表状态;
根据执行完成的节点路径对应的哈希表状态,确定待检测代码中是否存在内存泄露。
本发明实施例提供的一种计算机程序产品,具有与上述一种内存泄露检测方法相同的有益效果。
需要说明的是,本申请所涉及的用户信息(包括但不限于用户设备信息、用户个人信息等)和数据(包括但不限于用于分析的数据、存储的数据、展示的数据等),均为经用户授权或者经过各方充分授权的信息和数据。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的计算机程序可存储于一非易失性计算机可读取存储介质中,该计算机程序在执行时,可包括如上述各方法的实施例的流程。其中,本申请所提供的各实施例中所使用的对存储器、数据库或其它介质的任何引用,均可包括非易失性和易失性存储器中的至少一种。非易失性存储器可包括只读存储器(Read-OnlyMemory,ROM)、磁带、软盘、闪存、光存储器、高密度嵌入式非易失性存储器、阻变存储器(ReRAM)、磁变存储器(Magnetoresistive Random Access Memory,MRAM)、铁电存储器(Ferroelectric Random Access Memory,FRAM)、相变存储器(Phase Change Memory,PCM)、石墨烯存储器等。易失性存储器可包括随机存取存储器(Random Access Memory,RAM)或外部高速缓冲存储器等。作为说明而非局限,RAM可以是多种形式,比如静态随机存取存储器(Static Random Access Memory,SRAM)或动态随机存取存储器(Dynamic RandomAccess Memory,DRAM)等。本申请所提供的各实施例中所涉及的数据库可包括关系型数据库和非关系型数据库中至少一种。非关系型数据库可包括基于区块链的分布式数据库等,不限于此。本申请所提供的各实施例中所涉及的处理器可为通用处理器、中央处理器、图形处理器、数字信号处理器、可编程逻辑器、基于量子计算的数据处理逻辑器等,不限于此。
以上实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。
以上所述实施例仅表达了本申请的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对本申请专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本申请构思的前提下,还可以做出若干变形和改进,这些都属于本申请的保护范围。因此,本申请的保护范围应以所附权利要求为准。
Claims (10)
1.一种内存泄露检测方法,其特征在于,所述方法包括:
获取与内存操作对应的待检测代码;
生成与所述待检测代码对应的控制流图,并根据所述控制流图确定出节点路径;
依据代码指令与哈希表操作的对应关系,依次对所述节点路径中的各节点的代码指令执行对应的哈希表操作,并更新哈希表状态;
根据执行完成的所述节点路径对应的哈希表状态,确定所述待检测代码中是否存在内存泄露。
2.根据权利要求1所述的方法,其特征在于,所述依据代码指令与哈希表操作的对应关系,依次对所述节点路径中的各节点的代码指令执行对应的哈希表操作,并更新哈希表状态,包括:
将所述控制流图中的各所述节点路径输入至中间模型;
利用所述中间模型解析各所述节点,并将各所述节点按照所述控制流图的形式转存至所述中间模型中;
通过所述中间模型依次调用所述节点路径中的各所述节点,依据所述代码指令与所述哈希表操作的对应关系,对各所述节点的所述代码指令执行对应的哈希表操作,并更新所述哈希表状态。
3.根据权利要求2所述的方法,其特征在于,所述通过所述中间模型依次调用所述节点路径中的各所述节点,依据所述代码指令与所述哈希表操作的对应关系,对各所述节点的所述代码指令执行对应的哈希表操作,并更新所述哈希表状态,包括:
通过所述中间模型依次调用所述节点路径中的各所述节点;
依据所述代码指令与所述哈希表操作的对应关系,确定出所述节点的代码指令对应的哈希表操作;
根据所述哈希表操作以及指针与内存块的映射关系,更新所述哈希表状态。
4.根据权利要求1所述的方法,其特征在于,所述生成与所述待检测代码对应的控制流图,并根据所述控制流图确定出节点路径,包括:
根据所述待检测代码中的流程关系确定节点和控制流线,并根据所述节点和所述控制流线确定出所述控制流图;
利用所述控制流图中起始节点和结束节点之间的节点和控制流线,确定出所述节点路径。
5.根据权利要求1至4任一项所述的方法,其特征在于,所述控制流图中的每个所述节点中的信息包括节点号、所述节点对应的代码指令所在行数、所述节点对应的代码指令的内容以及所述节点的后继节点的节点号。
6.根据权利要求5所述的方法,其特征在于,所述方法还包括:
根据所述哈希表状态的异常数据和所述哈希表操作确定出异常操作语句;
根据所述异常操作语句确定出所述待检测代码中存在内存泄露的代码指令位置。
7.一种内存泄露检测装置,其特征在于,所述装置包括:
获取模块,用于获取与内存操作对应的待检测代码;
确定模块,用于生成与所述待检测代码对应的控制流图,并根据所述控制流图确定出节点路径;
操作模块,用于依据代码指令与哈希表操作的对应关系,依次对所述节点路径中的各节点的代码指令执行对应的哈希表操作,并更新哈希表状态;
检测模块,用于根据执行完成的所述节点路径对应的哈希表状态,确定所述待检测代码中是否存在内存泄露。
8.一种计算机设备,包括存储器和处理器,所述存储器存储有计算机程序,其特征在于,所述处理器执行所述计算机程序时实现权利要求1至6中任一项所述的方法的步骤。
9.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现权利要求1至6中任一项所述的方法的步骤。
10.一种计算机程序产品,包括计算机程序,其特征在于,该计算机程序被处理器执行时实现权利要求1至6中任一项所述的方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111455500.0A CN114238086A (zh) | 2021-12-01 | 2021-12-01 | 内存泄露检测方法、装置、计算机设备和存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111455500.0A CN114238086A (zh) | 2021-12-01 | 2021-12-01 | 内存泄露检测方法、装置、计算机设备和存储介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN114238086A true CN114238086A (zh) | 2022-03-25 |
Family
ID=80752649
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202111455500.0A Pending CN114238086A (zh) | 2021-12-01 | 2021-12-01 | 内存泄露检测方法、装置、计算机设备和存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN114238086A (zh) |
-
2021
- 2021-12-01 CN CN202111455500.0A patent/CN114238086A/zh active Pending
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US9940229B2 (en) | Technologies for persistent memory programming | |
CN102789416B (zh) | 面向bit软件测试的存储器故障注入方法及其模拟器 | |
US7912877B2 (en) | Leveraging garbage collection to dynamically infer heap invariants | |
CN110741354B (zh) | 呈现代码实体调用之间的差异 | |
US8418134B2 (en) | Method for efficiently managing property types and constraints in a prototype based dynamic programming language | |
US9021455B2 (en) | Packed data objects | |
CN108563694B (zh) | 对逻辑删除的sql执行方法、装置、计算机设备和存储介质 | |
US11238035B2 (en) | Personal information indexing for columnar data storage format | |
CN116560683A (zh) | 软件更新方法、装置、设备及存储介质 | |
JP2017174418A (ja) | モデルチェックのためのデータ構造抽象化 | |
CN110175128B (zh) | 一种相似代码案例获取方法、装置、设备和存储介质 | |
CN112698819A (zh) | 面向树化对象编程程序设计方法、装置及存储介质 | |
CA3144686A1 (en) | Sql statement generator | |
CN110727777A (zh) | 知识图谱的管理方法、装置、计算机设备和存储介质 | |
CN110058849A (zh) | 流程图的生成方法、装置、计算机设备以及存储介质 | |
CN113791768A (zh) | 代码生成方法及装置、存储介质、终端 | |
CN114238086A (zh) | 内存泄露检测方法、装置、计算机设备和存储介质 | |
CN115562989A (zh) | 一种自动化测试序列转化方法、系统、设备和介质 | |
CN115481025A (zh) | 自动化测试的脚本录制方法、装置、计算机设备及介质 | |
CN115129598A (zh) | 一种sql语句的风险检测方法、装置、系统及介质 | |
CN114880673A (zh) | 针对小程序源代码进行隐私数据泄露检测的方法及系统 | |
Liu et al. | PTDETECTOR: An Automated JavaScript Front-end Library Detector | |
CN115858183B (zh) | 异步并行i/o请求的进程间联合分析方法、装置及设备 | |
US20230100418A1 (en) | Metadata-driven data ingestion | |
Wang | Partition memory models for program analysis |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |