CN106407104B - 一种用于检测与内存空间释放相关的缺陷的方法及系统 - Google Patents
一种用于检测与内存空间释放相关的缺陷的方法及系统 Download PDFInfo
- Publication number
- CN106407104B CN106407104B CN201610721120.XA CN201610721120A CN106407104B CN 106407104 B CN106407104 B CN 106407104B CN 201610721120 A CN201610721120 A CN 201610721120A CN 106407104 B CN106407104 B CN 106407104B
- Authority
- CN
- China
- Prior art keywords
- value
- memory
- symbol
- defect
- release
- 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.)
- Active
Links
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/3604—Software analysis for verifying properties of programs
- G06F11/3608—Software analysis for verifying properties of programs using formal methods, e.g. model checking, abstract interpretation
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Debugging And Monitoring (AREA)
- Techniques For Improving Reliability Of Storages (AREA)
Abstract
本发明涉及一种用于检测与内存空间释放相关的缺陷的方法和系统,所述方法包括:根据待检测源代码的编程语言的文法确定多个程序点;基于符号执行的检测逻辑从所述多个程序点中确定需要进行检测的多个检测点;以所述多个检测点中的函数调用检测点作为检测逻辑的起点进行缺陷检测;调用内存释放函数并且确定所述内存释放函数中的释放参数是否是内存地址;以及在所述释放参数是内存地址的情况下,根据所述释放参数的符号值来确定检测结果。
Description
技术领域
本发明涉及代码检测领域,并且更具体地,涉及一种用于检测与内存空间释放相关的缺陷的方法及系统。
背景技术
随着网络技术和应用的飞速发展,软件系统安全正面临着前所未有的挑战。网络化和互联互通性已经成为当前软件系统的发展方向。软件系统与互联网或其他网络的互连,使软件系统遭受攻击的概率增大,也导致了软件系统面临的安全威胁空前地增加。另一方面,随着构建在软件系统之上的各种业务应用的不断丰富,以及软件程序复杂程度的不断提高,软件系统中隐藏的各种安全隐患也越来越多,并且通常难以被发现和消除。
目前,针对软件中存在的安全问题进行检测逐渐成为软件系统领域的热点。基于源代码的静态分析方式是检测软件源代码安全问题的有效手段。静态分析是在不执行程序的情况下对软件源代码进行分析的技术,其通过对当前状态及趋势的分析来预判所有软件未来运行的可能情况。源代码静态分析方法包括公理化语义、操作语义、抽象解释理论等,并且常见的实现技术有模型检验、数据流分析、抽象解释、谓词转换、类型推导、符号执行等。
符号执行是指在不执行程序的前提下,用符号值表示变量的值,然后模拟程序执行来进行相关分析的技术。符号执行可以分析代码的所有语义信息,也可以只分析部分语义信息。然而,目前的符号执行技术并未针对与内存空间释放相关问题的有效检测手段,而内存空间释放问题通常会造成软件系统出现严重故障。
发明内容
根据本发明的一个方面,提供一种用于检测与内存空间释放相关的缺陷的方法,所述方法包括:
根据待检测源代码的编程语言的文法确定多个程序点;
基于符号执行的检测逻辑从所述多个程序点中确定需要进行检测的多个检测点;
以所述多个检测点中的函数调用检测点作为检测逻辑的起点进行缺陷检测;
调用内存释放函数并且确定所述内存释放函数中的释放参数是否是内存地址;以及
在所述释放参数是内存地址的情况下,根据所述释放参数的符号值来确定检测结果。
优选地,其中根据所述释放参数的符号值来确定检测结果包括:当符号值的状态为已释放状态时,确定待检测源代码存在重复释放缺陷。
优选地,其中根据所述释放参数的符号值来确定检测结果包括:当符号值所指示的释放内存类型与分配内存类型不匹配时,确定待检测源代码存在释放类型不匹配缺陷。
优选地,其中根据所述释放参数的符号值来确定检测结果包括:当符号值所指示的释放位置为所分配位置的偏移时,确定待检测源代码存在释放位置偏移缺陷。
优选地,在以所述多个检测点中的函数调用检测点作为检测逻辑的起点进行缺陷检测之后还包括:调用内存分配函数并且设置符号值,将内存分配所占用的内存大小更新为相应的尺寸参数。
优选地,在内存分配结束后,将符号值的状态设置为已分配并且对分配内存类型进行记录。
优选地,所述内存地址包括:基地址、栈空间地址或分配空间地址。
优选地,当所述释放参数不是内存地址时,确定待检测源代码存在错误释放缺陷。
根据本发明的另一方面,提供一种用于检测与内存空间释放相关的缺陷的系统,所述系统包括:
初始化单元,根据待检测源代码的编程语言的文法确定多个程序点;基于符号执行的检测逻辑从所述多个程序点中确定需要进行检测的多个检测点;以及
缺陷检测单元,以所述多个检测点中的函数调用检测点作为检测逻辑的起点进行缺陷检测;调用内存释放函数并且确定所述内存释放函数中的释放参数是否是内存地址;在所述释放参数是内存地址的情况下,根据所述释放参数的符号值来确定检测结果。
优选地,其中根据所述释放参数的符号值来确定检测结果包括:当符号值的状态为已释放状态时,缺陷检测单元确定待检测源代码存在重复释放缺陷。
优选地,其中根据所述释放参数的符号值来确定检测结果包括:当符号值所指示的释放内存类型与分配内存类型不匹配时,缺陷检测单元确定待检测源代码存在释放类型不匹配缺陷。
优选地,其中根据所述释放参数的符号值来确定检测结果包括:当符号值所指示的释放位置为所分配位置的偏移时,缺陷检测单元确定待检测源代码存在释放位置偏移缺陷。
优选地,缺陷检测单元还能够调用内存分配函数并且设置符号值,将内存分配所占用的内存大小更新为相应的尺寸参数。
优选地,在内存分配结束后,缺陷检测单元将符号值的状态设置为已分配并且对分配内存类型进行记录。
优选地,所述内存地址包括:基地址、栈空间地址或分配空间地址。
优选地,当所述释放参数不是内存地址时,缺陷检测单元确定待检测源代码存在错误释放缺陷。
附图说明
通过参考下面的附图,可以更为完整地理解本发明的示例性实施方式:
图1为根据本发明实施方式的用于检测与内存空间释放相关缺陷的方法的流程图;
图2为根据本发明实施方式的用于检测与内存空间释放相关缺陷的系统的结构示意图;以及
图3为根据本发明实施方式的在函数调用检测点处执行的检测方法的流程图。
具体实施方式
现在参考附图介绍本发明的示例性实施方式,然而,本发明可以用许多不同的形式来实施,并且不局限于此处描述的实施例,提供这些实施例是为了详尽地且完全地公开本发明,并且向所属技术领域的技术人员充分传达本发明的范围。对于表示在附图中的示例性实施方式中的术语并不是对本发明的限定。在附图中,相同的单元/元件使用相同的附图标记。
除非另有说明,此处使用的术语(包括科技术语)对所属技术领域的技术人员具有通常的理解含义。另外,可以理解的是,以通常使用的词典限定的术语,应当被理解为与其相关领域的语境具有一致的含义,而不应该被理解为理想化的或过于正式的意义。
图1为根据本发明实施方式的用于检测与内存空间释放相关缺陷的方法100的流程图。在符号执行的过程中,方法100首先根据待检测源代码的编程语言(例如,C/C++)的特性确定各种程序点(Program Point),然后再根据符号执行的特性和检测逻辑的需要,进一步抽象出需要进行检测相关逻辑的检测点(Check Point)。通常,一种具体的缺陷检测需要在几个检测点上分别实现相应的检测逻辑。这样,在符号执行的过程中,每执行到一个检测点,引擎会尝试调用各个检测器在当前检测点的检测逻辑。除了主要检测点之外的其他检测点上的检测逻辑通常是可以通过调用已知工具来实现。而一种具体的缺陷检测的主要检测逻辑需要在主要检测点上执行。因此,在确定了主要检测点上的检测逻辑后,即可完成对某一具体缺陷的检测。此外,任何一种缺陷的检测都不是完全独立的,都依赖于引擎内部或者其他检测器的某些建模功能。
优选地,方法100从步骤101处开始。在步骤101处,根据待检测源代码的编程语言的文法确定多个程序点。通常,为了确定检测点,必须首先确定程序点。程序点的确定依赖于编程语言各自不同的文法。为了准确地确定程序点,通常要对待检测源代码进行解释和分析。这种分析和解释包括:读取程序源代码并且提取程序中的信息要素。这主要是通过词法分析、语法分析和抽象语法树来实现。符号执行的主要功能是借助于约束求解器对抽象语法树进行遍历,完成对路径的符号执行,符号执行阶段由路径条件的约束求解和路径的符号执行构成。
优选地,为了根据待检测源代码的编程语言的文法确定多个程序点,通常要完成如下步骤:将被测代码输入测试工具中;根据待检测源代码的编程语言(例如,C/C++)的言文法自定义一个关键词列表,并对照关键词列表对被测试代码进行词法分析;根据待检测源代码的编程语言的文法定义函数结构模块、构造抽象语法树的生成算法,并对照词法分析的结果,利用“自下而上”的方法(即从语法树的末端开始,向上“归约”)。对被测代码进行语法分析,最终得到程序静态分析树作为一个中间表示形式,并且利用文档进行存储;根据词法分析结果,以特定结构体的形式(包含变量名称及变量的符号值)建立变量列表并且以链表的形式存储当前路径条件;根据语法分析结果,对抽象语法树进行中序遍历,从而确定多个程序点。
优选地,在步骤102,基于符号执行的检测逻辑从所述多个程序点中确定需要进行检测的多个检测点。通常,为了检测数组越界缺陷,可能需要在多个检测点处执行检测逻辑。并且,多个检测点通常来自于上面确定的多个程序点。为了能够准确地确定检测点,本发明基于符号执行的检测逻辑来确定需要进行检测的多个检测点。
优选地,在步骤103,以所述多个检测点中的内存读写检测点作为检测逻辑的起点进行缺陷检测。通常除了主要检测点之外的其他检测点上的检测逻辑通常是可以通过调用已知工具来实现。而特定缺陷检测的主要检测逻辑需要在主要检测点上执行。因此,本发明以多个检测点中的函数调用检测点作为主要检测点。并且,将主要检测点,即函数调用检测点,作为检测逻辑的起点进行缺陷检测。
优选地,在步骤104,调用内存释放函数并且确定所述内存释放函数中的释放参数是否是内存地址。本发明以函数调用检测点作为起点进行缺陷检测(即执行检测逻辑),并且在函数调用检测点之后根据函数类型的不同来执行不同的逻辑。优选地,函数类型包括:内存分配函数、内存重新分配函数以及内存释放函数。其中,内存分配函数的作用是根据分配请求对内存空间进行分配,从而使得相应的程序/应用能够得到用于执行代码的内存空间。内存重新分配函数用于对其他程序/应用释放的内存空间进行重新分配,从而实现内存空间的有效利用。内存释放函数用于对特定程序/应用不再需要使用的内存空间进行释放,从而使得所释放的内存空间能够被重新分配给其他程序/应用。
优选地,方法100进行缺陷检测时主要针对内存释放函数进行,缺陷问题出现在内存释放函数中。因此,在步骤104,调用内存释放函数以进行缺陷检测。在调用内存释放函数后,必须确定内存释放函数中的释放参数是否是内存地址。这是因为如果内存释放函数中的释放参数不是内存地址,那么也就不存在对内存空间进行释放的可能,可以将这种问题直接确定为错误的释放。其中内存地址包括:基地址、栈空间地址或分配空间地址等。内存释放函数中的释放参数为基地址、栈空间地址或分配空间地址等时,可以确定内存释放函数不存在错误的释放的缺陷。
优选地,在步骤105,在所述释放参数是内存地址的情况下,根据所述释放参数的符号值来确定检测结果。其中根据所述释放参数的符号值来确定检测结果包括:当符号值的状态为已释放状态时,确定待检测源代码存在重复释放缺陷;当符号值所指示的释放内存类型与分配内存类型不匹配时,确定待检测源代码存在释放类型不匹配缺陷;以及当符号值所指示的释放位置为所分配位置的偏移时,确定待检测源代码存在释放位置偏移缺陷。
优选地,在以所述多个检测点中的函数调用检测点作为检测逻辑的起点进行缺陷检测之后还包括:调用内存分配函数并且设置符号值,将内存分配所占用的内存大小更新为相应的尺寸参数。优选地,在内存分配结束后,将符号值的状态设置为已分配并且对分配内存类型进行记录。
图2为根据本发明实施方式的用于检测与内存空间释放相关的缺陷的系统200的结构示意图。在符号执行的过程中,系统200首先根据待检测源代码的编程语言(例如,C/C++)的特性确定各种程序点,然后再根据符号执行的特性和检测逻辑的需要,进一步抽象出需要进行检测相关逻辑的检测点。通常,一种具体的缺陷检测需要在几个检测点上分别实现相应的检测逻辑。这样,在符号执行的过程中,每执行到一个检测点,引擎会尝试调用各个检测器在当前检测点的检测逻辑。除了主要检测点之外的其他检测点上的检测逻辑通常是可以通过调用已知工具来实现。而一种具体的缺陷检测的主要检测逻辑需要在主要检测点上执行。因此,在确定了主要检测点上的检测逻辑后,即可完成对某一具体缺陷的检测。此外,任何一种缺陷的检测都不是完全独立的,都依赖于引擎内部或者其他检测器的某些建模功能。
优选地,系统200包括初始化单元201和缺陷检测单元202。优选地,初始化单元201根据待检测源代码的编程语言的文法确定多个程序点。通常,为了确定检测点,必须首先确定程序点。程序点的确定依赖于编程语言各自不同的文法。为了准确地确定程序点,通常要对待检测源代码进行解释和分析。这种分析和解释包括:读取程序源代码并且提取程序中的信息要素。这主要是通过词法分析、语法分析和抽象语法树来实现。符号执行的主要功能是借助于约束求解器对抽象语法树进行遍历,完成对路径的符号执行,符号执行阶段由路径条件的约束求解和路径的符号执行构成。
优选地,初始化单元201为了根据待检测源代码的编程语言的文法确定多个程序点,通常要完成如下步骤:将被测代码输入测试工具中;根据待检测源代码的编程语言(例如,C/C++)的言文法自定义一个关键词列表,并对照关键词列表对被测试代码进行词法分析;根据待检测源代码的编程语言的文法定义函数结构模块、构造抽象语法树的生成算法,并对照词法分析的结果,利用“自下而上”的方法(即从语法树的末端开始,向上“归约”)。对被测代码进行语法分析,最终得到程序静态分析树作为一个中间表示形式,并且利用文档进行存储;根据词法分析结果,以特定结构体的形式(包含变量名称及变量的符号值)建立变量列表并且以链表的形式存储当前路径条件;根据语法分析结果,对抽象语法树进行中序遍历,从而确定多个程序点。
优选地,初始化单元201基于符号执行的检测逻辑从所述多个程序点中确定需要进行检测的多个检测点。通常,为了检测数组越界缺陷,可能需要在多个检测点处执行检测逻辑。并且,多个检测点通常来自于上面确定的多个程序点。为了能够准确地确定检测点,本发明基于符号执行的检测逻辑来确定需要进行检测的多个检测点。
优选地,缺陷检测单元202以所述多个检测点中的内存读写检测点作为检测逻辑的起点进行缺陷检测。通常除了主要检测点之外的其他检测点上的检测逻辑通常是可以通过调用已知工具来实现。而特定缺陷检测的主要检测逻辑需要在主要检测点上执行。因此,本发明以多个检测点中的函数调用检测点作为主要检测点。并且,将主要检测点,即函数调用检测点,作为检测逻辑的起点进行缺陷检测。
优选地,缺陷检测单元202调用内存释放函数并且确定所述内存释放函数中的释放参数是否是内存地址。本发明以函数调用检测点作为起点进行缺陷检测(即执行检测逻辑),并且在函数调用检测点之后根据函数类型的不同来执行不同的逻辑。优选地,函数类型包括:内存分配函数、内存重新分配函数以及内存释放函数。其中,内存分配函数的作用是根据分配请求对内存空间进行分配,从而使得相应的程序/应用能够得到用于执行代码的内存空间。内存重新分配函数用于对其他程序/应用释放的内存空间进行重新分配,从而实现内存空间的有效利用。内存释放函数用于对特定程序/应用不再需要使用的内存空间进行释放,从而使得所释放的内存空间能够被重新分配给其他程序/应用。
优选地,系统200进行缺陷检测时主要针对内存释放函数进行,缺陷问题出现在内存释放函数中。因此,缺陷检测单元202调用内存释放函数以进行缺陷检测。在调用内存释放函数后,必须确定内存释放函数中的释放参数是否是内存地址。这是因为如果内存释放函数中的释放参数不是内存地址,那么也就不存在对内存空间进行释放的可能,可以将这种问题直接确定为错误的释放。其中内存地址包括:基地址、栈空间地址或分配空间地址等。内存释放函数中的释放参数为基地址、栈空间地址或分配空间地址等时,可以确定内存释放函数不存在错误的释放的缺陷。
优选地,缺陷检测单元202在所述释放参数是内存地址的情况下,根据所述释放参数的符号值来确定检测结果。其中根据所述释放参数的符号值来确定检测结果包括:当符号值的状态为已释放状态时,确定待检测源代码存在重复释放缺陷;当符号值所指示的释放内存类型与分配内存类型不匹配时,确定待检测源代码存在释放类型不匹配缺陷;以及当符号值所指示的释放位置为所分配位置的偏移时,确定待检测源代码存在释放位置偏移缺陷。
优选地,在以所述多个检测点中的函数调用检测点作为检测逻辑的起点进行缺陷检测之后还包括:调用内存分配函数并且设置符号值,将内存分配所占用的内存大小更新为相应的尺寸参数。优选地,在内存分配结束后,将符号值的状态设置为已分配并且对分配内存类型进行记录。
图3为根据本发明实施方式的在函数调用检测点处执行的检测方法300的流程图。检测方法300是实现与内存空间释放相关缺陷的检测的检测逻辑,其以所述多个检测点中的函数调用检测点作为检测逻辑的起点进行缺陷检测;调用内存释放函数并且确定所述内存释放函数中的释放参数是否是内存地址;以及在所述释放参数是内存地址的情况下,根据所述释放参数的符号值来确定检测结果
如图3所示,方法300从步骤301处开始。在步骤301,进入函数调用检测点,从而开始与内存空间释放相关的缺陷的检测。其中函数调用检测点是由如上所述的初始化单元从多个检测点中选取的用于检测与内存空间释放相关的缺陷的主要检测点。
在步骤302,确定函数类型。由于方法300以函数调用检测点作为起点进行缺陷检测(即执行检测逻辑),并且在函数调用检测点之后根据函数类型的不同来执行不同的逻辑。优选地,函数类型包括:内存分配函数、内存重新分配函数以及内存释放函数。其中,内存分配函数的作用是根据分配请求对内存空间进行分配,从而使得相应的程序/应用能够得到用于执行代码的内存空间。内存重新分配函数用于对其他程序/应用释放的内存空间进行重新分配,从而实现内存空间的有效利用。内存释放函数用于对特定程序/应用不再需要使用的内存空间进行释放,从而使得所释放的内存空间能够被重新分配给其他程序/应用。
当在步骤302处确定函数类型为内存重新分配函数时,方法300进行到步骤303。在步骤303,判断重新分配的内存地址的初始值是否为空。因为要进行内存空间的重新分配,因此必须首先确定要被重新分配的内存空间是可用的,即确定要被重新分配的内存空间的地址初始值是否为空。当在步骤303处确定要被重新分配的内存空间的地址初始值为空时,进行步骤305。在步骤305,进行内存分配函数(下面将会介绍)的处理。由于已经确定了要被重新分配的内存空间是可用的,因此可以执行内存分配函数以进行内存的重新分配。
当在步骤303处确定要被重新分配的内存空间的地址初始值不为空时,方法300进行到步骤304以释放相关的内存空间。在步骤304,进行内存释放函数(下面将会介绍)的处理。内存释放函数能够将重新分配的内存空间进行释放,从而满足内存重新分配的要求。然后,在步骤305,进行内存分配函数(下面将会介绍)的处理。由于已经确定了要被重新分配的内存空间是可用的,因此可以执行内存分配函数以进行内存的重新分配。
当在步骤302处确定函数类型为内存分配函数时,方法300进行到步骤306。在步骤306,为函数返回值创建符号,并且其占用的内存大小更新为相应的size参数。接着,在步骤307,将符号的状态标记为已分配并且记录分配内存类型。优选地,在内存释放,将分配内存类型与释放内存类型进行匹配,从而确定这种释放是否为缺陷。
然后,在步骤308处,更新符号执行的状态。由于在步骤307处将符号的状态标记为已分配,因此在步骤308处必须对符号执行的状态进行更新。在这种情况下,进行步骤321,退出当前的缺陷检测逻辑并且可以继续进行其他的符号执行。
当在步骤302处确定函数类型为内存释放函数时,方法300进行到步骤309。在步骤309,方法300判断释放参数是否为空。如果释放参数为空,即存在不需要释放任何空间的内存释放,因此不需要进行内存释放。在这种情况下,进行步骤321,退出当前的缺陷检测逻辑并且可以继续进行其他的符号执行。
如果在步骤309,确定释放参数不为空,那么可以进行到步骤310。在步骤310,判断释放参数是否为非内存地址。在调用内存释放函数后,必须确定内存释放函数中的释放参数是否是内存地址。这是因为如果内存释放函数中的释放参数不是内存地址,那么也就不存在对内存空间进行释放的可能,可以将这种问题直接确定为错误的释放。其中内存地址包括:基地址、栈空间地址或分配空间地址等。即如果释放参数为非内存地址,方法300进行到步骤311。在步骤311,确定检测到缺陷的类型为错误的释放。
如果内存释放函数中的释放参数为基地址、栈空间地址或分配空间地址等时,可以确定内存释放函数不存在错误的释放的缺陷并且进行到步骤312。
在步骤312,确定释放参数是否为符号值。如果释放参数不是符号值,则方法300进行步骤321,退出当前的缺陷检测逻辑并且可以继续进行其他的符号执行。
如果在步骤312处确定释放参数为符号值,那么进行到步骤313。
在步骤313,获取符号值的状态,并且然后进行到步骤314。
在步骤314,判断符号值的状态是否为已释放状态。如果符号值的状态为已释放状态,那么进行步骤315。在步骤315,确定待检测源代码存在重复释放缺陷。也就是说,释放参数所涉及的内存空间已经被释放了。
如果符号值的状态不是已释放状态,那么进行步骤316。在步骤316,判断符号值所指示的释放内存类型与分配内存类型是否匹配。如果符号值所指示的释放内存类型与分配内存类型不匹配时,进行步骤317。在步骤317,确定待检测源代码存在释放类型不匹配缺陷。也就是说,同一内存空间的内存分配类型和内存释放类型不同。
如果符号值所指示的释放内存类型与分配内存类型匹配时,进行步骤318。在步骤318,确定符号值所指示的释放位置是否为所分配位置的偏移。如果符号值所指示的释放位置为所分配位置的偏移时,进行步骤319。在步骤319,确定待检测源代码存在释放位置偏移缺陷。
如果符号值所指示的释放位置不是所分配位置的偏移时,进行步骤320。在步骤320,完成内存空间释放并且将该符号值的状态标记为已释放。
然后,在步骤308处,更新符号执行的状态。随后,进行步骤321,退出当前的缺陷检测逻辑并且可以继续进行其他的符号执行。
已经通过参考少量实施方式描述了本发明。然而,本领域技术人员所公知的,正如附带的专利权利要求所限定的,除了本发明以上公开的其他的实施例等同地落在本发明的范围内。
通常地,在权利要求中使用的所有术语都根据他们在技术领域的通常含义被解释,除非在其中被另外明确地定义。所有的参考“一个/所述/该[装置、组件等]”都被开放地解释为所述装置、组件等中的至少一个实例,除非另外明确地说明。这里公开的任何方法的步骤都没必要以公开的准确的顺序运行,除非明确地说明。
Claims (16)
1.一种用于检测与内存空间释放相关的缺陷的方法,所述方法包括:
根据待检测源代码的编程语言的文法确定多个程序点;
基于符号执行的检测逻辑从所述多个程序点中确定需要进行检测的多个检测点;
以所述多个检测点中的函数调用检测点作为检测逻辑的起点进行缺陷检测;在符号执行的过程中,每执行到一个检测点,尝试调用各个检测器在当前检测点的检测逻辑;
调用内存释放函数并且确定所述内存释放函数中的释放参数是否是内存地址;以及
在所述释放参数是内存地址的情况下,根据所述释放参数的符号值来确定检测结果。
2.根据权利要求1所述的方法,其中根据所述释放参数的符号值来确定检测结果包括:当符号值的状态为已释放状态时,确定待检测源代码存在重复释放缺陷。
3.根据权利要求1所述的方法,其中根据所述释放参数的符号值来确定检测结果包括:当符号值所指示的释放内存类型与分配内存类型不匹配时,确定待检测源代码存在释放类型不匹配缺陷。
4.根据权利要求1所述的方法,其中根据所述释放参数的符号值来确定检测结果包括:当符号值所指示的释放位置为所分配位置的偏移时,确定待检测源代码存在释放位置偏移缺陷。
5.根据权利要求1所述的方法,在以所述多个检测点中的函数调用检测点作为检测逻辑的起点进行缺陷检测之后还包括:调用内存分配函数并且设置符号值,将内存分配所占用的内存大小更新为相应的尺寸参数。
6.根据权利要求5所述的方法,在内存分配结束后,将符号值的状态设置为已分配并且对分配内存类型进行记录。
7.根据权利要求1所述的方法,所述内存地址包括:基地址、栈空间地址或分配空间地址。
8.根据权利要求1或7所述的方法,当所述释放参数不是内存地址时,确定待检测源代码存在错误释放缺陷。
9.一种用于检测与内存空间释放相关的缺陷的系统,所述系统包括:
初始化单元,根据待检测源代码的编程语言的文法确定多个程序点;基于符号执行的检测逻辑从所述多个程序点中确定需要进行检测的多个检测点;以及
缺陷检测单元,以所述多个检测点中的函数调用检测点作为检测逻辑的起点进行缺陷检测;在符号执行的过程中,每执行到一个检测点,尝试调用各个检测器在当前检测点的检测逻辑;调用内存释放函数并且确定所述内存释放函数中的释放参数是否是内存地址;在所述释放参数是内存地址的情况下,根据所述释放参数的符号值来确定检测结果。
10.根据权利要求9所述的系统,其中根据所述释放参数的符号值来确定检测结果包括:当符号值的状态为已释放状态时,缺陷检测单元确定待检测源代码存在重复释放缺陷。
11.根据权利要求9所述的系统,其中根据所述释放参数的符号值来确定检测结果包括:当符号值所指示的释放内存类型与分配内存类型不匹配时,缺陷检测单元确定待检测源代码存在释放类型不匹配缺陷。
12.根据权利要求9所述的系统,其中根据所述释放参数的符号值来确定检测结果包括:当符号值所指示的释放位置为所分配位置的偏移时,缺陷检测单元确定待检测源代码存在释放位置偏移缺陷。
13.根据权利要求9所述的系统,缺陷检测单元还能够调用内存分配函数并且设置符号值,将内存分配所占用的内存大小更新为相应的尺寸参数。
14.根据权利要求13所述的系统,在内存分配结束后,缺陷检测单元将符号值的状态设置为已分配并且对分配内存类型进行记录。
15.根据权利要求9所述的系统,所述内存地址包括:基地址、栈空间地址或分配空间地址。
16.根据权利要求9或15所述的系统,当所述释放参数不是内存地址时,缺陷检测单元确定待检测源代码存在错误释放缺陷。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610721120.XA CN106407104B (zh) | 2016-08-24 | 2016-08-24 | 一种用于检测与内存空间释放相关的缺陷的方法及系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610721120.XA CN106407104B (zh) | 2016-08-24 | 2016-08-24 | 一种用于检测与内存空间释放相关的缺陷的方法及系统 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN106407104A CN106407104A (zh) | 2017-02-15 |
CN106407104B true CN106407104B (zh) | 2018-12-04 |
Family
ID=58004763
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201610721120.XA Active CN106407104B (zh) | 2016-08-24 | 2016-08-24 | 一种用于检测与内存空间释放相关的缺陷的方法及系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN106407104B (zh) |
Families Citing this family (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109739645A (zh) * | 2018-12-25 | 2019-05-10 | 新华三技术有限公司成都分公司 | 内存管理方法、装置及存储介质 |
CN112783755B (zh) * | 2019-11-07 | 2024-03-22 | 上海蜚语信息科技有限公司 | 一种基于自然语言理解函数原型发现内存破坏漏洞的方法 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101482847A (zh) * | 2009-01-19 | 2009-07-15 | 北京邮电大学 | 一种基于安全漏洞缺陷模式的检测方法 |
US9367681B1 (en) * | 2013-02-23 | 2016-06-14 | Fireeye, Inc. | Framework for efficient security coverage of mobile software applications using symbolic execution to reach regions of interest within an application |
CN105678169A (zh) * | 2015-12-30 | 2016-06-15 | 西安胡门网络技术有限公司 | 一种二进制程序漏洞挖掘方法和系统 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9274925B2 (en) * | 2013-04-30 | 2016-03-01 | Fujitsu Limited | Programmable symbolic execution based dynamic checker |
-
2016
- 2016-08-24 CN CN201610721120.XA patent/CN106407104B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101482847A (zh) * | 2009-01-19 | 2009-07-15 | 北京邮电大学 | 一种基于安全漏洞缺陷模式的检测方法 |
US9367681B1 (en) * | 2013-02-23 | 2016-06-14 | Fireeye, Inc. | Framework for efficient security coverage of mobile software applications using symbolic execution to reach regions of interest within an application |
CN105678169A (zh) * | 2015-12-30 | 2016-06-15 | 西安胡门网络技术有限公司 | 一种二进制程序漏洞挖掘方法和系统 |
Non-Patent Citations (1)
Title |
---|
C/C++源代码静态检测系统的设计和实现;饶坤;《中国优秀硕士学位论文全文数据库 信息科技辑》;20130115(第01期);第18-24、36-39页 * |
Also Published As
Publication number | Publication date |
---|---|
CN106407104A (zh) | 2017-02-15 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Harder et al. | Improving test suites via operational abstraction | |
CN110399300B (zh) | 一种基于动态类型感知的Python软件模糊测试方法 | |
CN117951701A (zh) | 用于确定软件代码中的缺陷和漏洞的方法 | |
CN100461132C (zh) | 基于源代码静态分析的软件安全代码分析器及其检测方法 | |
Gegick et al. | Prioritizing software security fortification throughcode-level metrics | |
CN102073588B (zh) | 一种基于代码静态分析的多线程死锁检测方法及系统 | |
Gong et al. | Automatic detection of infeasible paths in software testing | |
Kessentini et al. | Search-based design defects detection by example | |
CN104537308B (zh) | 提供应用安全审计功能的系统及方法 | |
Bhat et al. | Equivalence class partitioning and boundary value analysis-a review | |
CN114065677B (zh) | 用于集成电路硬件设计的故障注入测试的方法和系统 | |
Reger et al. | A pattern-based approach to parametric specification mining | |
CN104090798A (zh) | 动静态结合的中断驱动程序数据竞争检测方法 | |
CN106407104B (zh) | 一种用于检测与内存空间释放相关的缺陷的方法及系统 | |
CN106326123B (zh) | 一种用于检测数组越界缺陷的方法及系统 | |
CN108958890A (zh) | 容器镜像检测方法、装置及电子设备 | |
Aho et al. | Making GUI testing practical: Bridging the gaps | |
Nishiura et al. | Improving faulty interaction localization using logistic regression | |
Maragathavalli et al. | Automatic program instrumentation in generation of test data using genetic algorithm for multiple paths coverage | |
CN110083538A (zh) | 一种并发程序噪声注入方法 | |
Li et al. | Automatically generating functional scenarios from SOFL CDFD for specification inspection | |
Patel et al. | Resolving the equivalent mutant problem in the presence of non-determinism and coincidental correctness | |
Stephenson et al. | Test data generation for product lines-a mutation testing approach | |
Ciancarini et al. | Mining concurrency bugs | |
Farchi et al. | Using program closures to make an application programming interface (API) implementation thread safe |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant | ||
CP03 | Change of name, title or address |
Address after: Room 403-46, 4th Floor, No. 20 Jiuxianqiao Road, Chaoyang District, Beijing, 100016 Patentee after: BEIJING QIHU CETENG SECURITY TECHNOLOGY Co.,Ltd. Patentee after: Qianxin Technology Group Co.,Ltd. Address before: Room 403-46, 4th Floor, No. 20 Jiuxianqiao Road, Chaoyang District, Beijing, 100020 Patentee before: BEIJING QIHU CETENG SECURITY TECHNOLOGY Co.,Ltd. Patentee before: BEIJING QIANXIN TECHNOLOGY Co.,Ltd. |
|
CP03 | Change of name, title or address |