CN109426615B - 过程间的空指针解引用检测方法、系统、设备以及介质 - Google Patents

过程间的空指针解引用检测方法、系统、设备以及介质 Download PDF

Info

Publication number
CN109426615B
CN109426615B CN201811014686.4A CN201811014686A CN109426615B CN 109426615 B CN109426615 B CN 109426615B CN 201811014686 A CN201811014686 A CN 201811014686A CN 109426615 B CN109426615 B CN 109426615B
Authority
CN
China
Prior art keywords
function
null pointer
called function
digest
called
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
Application number
CN201811014686.4A
Other languages
English (en)
Other versions
CN109426615A (zh
Inventor
肖枭
时清凯
周金果
范刚
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Shenzhen Qianhai Sourcebrella Inc ltd
Original Assignee
Shenzhen Qianhai Sourcebrella Inc ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Shenzhen Qianhai Sourcebrella Inc ltd filed Critical Shenzhen Qianhai Sourcebrella Inc ltd
Publication of CN109426615A publication Critical patent/CN109426615A/zh
Application granted granted Critical
Publication of CN109426615B publication Critical patent/CN109426615B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3604Software analysis for verifying properties of programs
    • G06F11/3608Software analysis for verifying properties of programs using formal methods, e.g. model checking, abstract interpretation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/50Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
    • G06F21/57Certifying or maintaining trusted computer platforms, e.g. secure boots or power-downs, version controls, system software checks, secure updates or assessing vulnerabilities
    • G06F21/577Assessing vulnerabilities and evaluating computer system security
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/50Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
    • G06F21/55Detecting local intrusion or implementing counter-measures
    • G06F21/56Computer malware detection or handling, e.g. anti-virus arrangements
    • G06F21/562Static detection
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/362Software debugging
    • G06F11/3624Software debugging by performing operations on the source code, e.g. via a compiler
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3604Software analysis for verifying properties of programs
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/362Software debugging
    • G06F11/366Software debugging using diagnostics
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3668Software testing
    • G06F11/3672Test management
    • G06F11/3688Test management for test execution, e.g. scheduling of test suites
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3668Software testing
    • G06F11/3672Test management
    • G06F11/3692Test management for test results analysis
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/90Details of database functions independent of the retrieved data types
    • G06F16/901Indexing; Data structures therefor; Storage structures
    • G06F16/9024Graphs; Linked lists
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/43Checking; Contextual analysis
    • G06F8/433Dependency analysis; Data or control flow analysis
    • G06F8/434Pointers; Aliasing
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F2221/00Indexing scheme relating to security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F2221/03Indexing scheme relating to G06F21/50, monitoring users, programs or devices to maintain the integrity of platforms
    • G06F2221/033Test or assess software
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/43Checking; Contextual analysis
    • G06F8/433Dependency analysis; Data or control flow analysis

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Computer Hardware Design (AREA)
  • Software Systems (AREA)
  • Quality & Reliability (AREA)
  • Computer Security & Cryptography (AREA)
  • Databases & Information Systems (AREA)
  • Data Mining & Analysis (AREA)
  • Computing Systems (AREA)
  • Health & Medical Sciences (AREA)
  • General Health & Medical Sciences (AREA)
  • Virology (AREA)
  • Debugging And Monitoring (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

本发明公开了一种过程间的空指针解引用检测方法、系统、设备以及介质,包括以下步骤:对待检测程序进行预处理;生成所述待检测程序中的主调函数和被调函数的符号表达式图,根据所述被调函数的符号表达式图对所述被调函数进行过程内分析,以检测所述被调函数中的空指针以及生成所述被调函数的函数摘要;将所述被调函数的所述函数摘要嵌入所述主调函数;根据所述主调函数的符号表达式图对所述主调函数进行过程内分析,以检测所述主调函数中的空指针解引用。

Description

过程间的空指针解引用检测方法、系统、设备以及介质
技术领域
本发明涉及的是程序检测领域,更具体的说,涉及一种过程间的空指针解引用检测方法、系统、设备以及介质。
背景技术
寻找空指针解引用问题有动态分析和静态分析两种方式。
动态分析通过使用预定或者随机输入多次执行程序看程序是否有运行异常,例如fuzzing技术。这类方法的问题在于是否能找到空指针问题取决于测试数据是否能触发错误,对程序执行的需求使得对于对执行环境难以模拟的程序,比如嵌入式系统程序很难实施。另外找到的错误需要进一步调试才能在代码中定位,从而修复问题。
静态分析技术直接分析程序源代码,可以全面分析程序,避开由于测试数据不完善导致的遗漏。静态程序分析不需要执行程序,所以适用性比动态程序分析广泛一些。但是静态分析由于程序复杂度问题,比如大量函数调用以及路径条件等,很难同时做到精确和高效。然而真实生产环境需要低误报以及高分析效率可以分析百万量级的代码,使得静态程序分析技术很难满足现实工业需求。静态分析技术主要有以下几类,基于模式匹配,比如Findbugs,这类技术只能找到浅层的问题,很难深入挖掘复杂的空指针错误。基于数据流的技术和符号执行的技术,比如Clang Static Analyzer很难处理复杂的程序调用关系,因为会触发路径爆炸问题,导致性能极其低下。
函数调用在现代程序设计中非常普遍,过程间分析能够找到过程内分析所忽略的信息,从而在静态分析中挖掘到更多的漏洞即空指针解引用。但是基于函数内联的过程间分析存在很多无用分析,分析效率低下,因此函数摘要被越来越多的用到过程间分析之中。在遇到函数调用时,对被调用函数进行分析提取其函数摘要,然后在调用点应用该函数摘要,以后每次遇到关于该函数的调用,都可以使用函数摘要代替其函数体。
发明内容
针对现有技术存在的问题,本发明的目的在于提供一种过程间的空指针解引用检测方法、系统、设备以及介质,能够通过符号表达式图分析程序中的主调函数和被调函数中的空指针解引用错误,提高了检测空指针解引用的效率,并且能够生成被调函数的摘要而后将被调函数的摘要嵌入主调函数从而进一步提高了程序中的空指针解引用的效率。
根据本发明的一个方面,提供一种过程间的空指针解引用检测方法,包括:
a.对待检测程序进行预处理;
b.生成所述待检测程序中的主调函数和被调函数的符号表达式图,所述符号表达式图包括值节点、运算符节点,以及连接节点的数据依赖性边和控制依赖性边,其中,值节点包括终端值节点和非终端值节点,终端值节点表示当前函数外生成的未知的值或常量,非终端值节点表示当前函数内生成的值,并且每个非终端值与一个唯一的内存地址相关联,所述数据依赖性边是将节点连接到与其有直接数据依赖关系的值节点的有向边,所述控制依赖性边是当存在限定变量的条件时将变量连接到条件的有向边;
c.根据所述被调函数的符号表达式图对所述被调函数进行过程内分析,以检测所述被调函数中的空指针以及生成所述被调函数的函数摘要;
d.将所述被调函数的所述函数摘要嵌入所述主调函数;
e.根据所述主调函数的符号表达式图对所述主调函数进行过程内分析,以检测所述主调函数中的空指针解引用。
优选的,所述函数摘要包括符号摘要、输入摘要以及输出摘要;
通过被嵌入后的所述输入摘要获得所述被调函数中的空指针解引用并生成第一错误报告;
通过被嵌入后的所述输出摘要获得所述被调函数的输出变量的空指针解引用并生成第二错误报告;
所述符号摘要用于向所述主调函数传递实例化后的所述被调函数的所述输出变量。
优选的,所述步骤c具体包括以下步骤:
从空指针节点开始对所述被调函数的所述符号表达式图向后进行深度优先遍历,以获得所述被调函数中的发生空指针解引用的第一变量;
根据所述第一变量生成空指针解引用错误报告;
若所述第一变量的路径约束中包括所述被调函数的输入变量,则根据被所述第一变量生成所述输入摘要。
优选的,所述输入摘要为一五元组<I,C,R,D,S>,其中:R为报告键值,I为输入变量,C为路径约束集,D为摘要描述,S为检查特定信息。
优选的,所述步骤c具体包括以下步骤:
根据所述被调函数的所述符号表达式图获得所述被调函数的输出变量,以及所述输出变量的路径约束;
根据所述被调函数的所述输出变量和所述输出变量的所述路径约束生成所述被调函数的符号摘要。
优选的,所述符号摘要为一三元组<I,O,C>,其中:I为所述被调函数的输入变量集合,O为所述被调函数的输出变量集合,C为路径约束集合。
优选的,所述步骤c具体包括以下步骤:
根据所述输出变量的所述路径约束,判断所述输出变量是否存在发生空指针解引用的路径:
若存在,则根据所述输出变量和所述路径约束生成所述被调函数的所述输出摘要。
优选的,所述输出摘要为一四元组<I,C,D,S>,其中:I为一输入变量,C为路径约束集,D摘要描述,S为检查特定信息。
优选的,所述步骤d包括以下步骤:
将所述输入摘要实例化,若所述输入摘要中的所述路径约束为真并且所述检查特定信息为真,则生成所述输入摘要对应的所述第一错误报告。
优选的,所述步骤d具体还包括以下步骤:
将所述符号摘要实例化,获得所述被调函数的所述输出变量的值并传递至述主调函数。
优选的,所述步骤d具体还包括以下步骤:
将所述输出摘要实例化,若所述输出摘要中的所述路径约束为真和所述检查特定信息检测为真,则生成所述输出摘要对应的第二错误报告。
优选的,所述步骤d具体包括以下步骤:
首先,通过被嵌入后的所述输入摘要获得所述被调函数中的空指针解引用并生成第一错误报告;
其次,通过被嵌入后的所述输出摘要获得所述被调函数的输出变量的空指针解引用并生成第二错误报告;
最后,将所述符号摘要用于向所述主调函数传递实例化后的所述被调函数的所述输出变量。
优选的,其特征在于,在所述步骤e中,
当检测到空指针时,为该空指针对应的空指针节点生成约束;
到达空指针解引用地址,添加约束,并检查是否满足约束,如果是,则生成错误报告。
优选的,所述步骤e还包括:
从空指针解引用地址返回到追溯点,并弹出解引用地址的约束,继续搜索空指针解引用地址,直到该符号表达式图遍历完成。
优选的,所述控制依赖性边指向的一侧为逻辑运算的运算符或布尔值节点。
优选的,用真和假来标记所述控制依赖性边,以表明逻辑运算的所需的结果。
优选的,待检测程序是程序片段,并且所述符号表达式图是从底层向上构建的。
优选的,所述预处理包括展开程序中的循环。
根据本发明的一个方面,提供一种过程间的空指针解引用检测系统,包括:
预处理模块,对待检测程序进行预处理;
表达式生成模块,生成所述待检测程序中的主调函数和被调函数的符号表达式图,所述符号表达式图包括值节点、运算符节点,以及连接节点的数据依赖性边和控制依赖性边,其中,值节点包括终端值节点和非终端值节点,终端值节点表示当前函数外生成的未知的值或常量,非终端值节点表示当前函数内生成的值,并且每个非终端值与一个唯一的内存地址相关联,所述数据依赖性边是将节点连接到与其有直接数据依赖关系的值节点的有向边,所述控制依赖性边是当存在限定变量的条件时将变量连接到条件的有向边;
摘要生成模块,根据所述被调函数的符号表达式图对所述被调函数进行过程内分析,以检测所述被调函数中的空指针以及生成所述被调函数的函数摘要;
嵌入模块,将所述被调函数的所述函数摘要嵌入所述主调函数;
分析模块,根据所述主调函数的符号表达式图对所述主调函数进行过程内分析,以检测所述主调函数中的空指针解引用。
根据本发明的一个方面,提供一种过程间的空指针解引用检测设备,包括:
处理器;
存储器,其中存储有所述处理器的可执行指令;
其中,所述处理器配置为经由执行所述可执行指令来执行上述过程间的空指针解引用检测方法的步骤。
根据本发明的一个方面,提供一种计算机可读存储介质,用于存储程序,所述程序被执行时实现上述过程间的空指针解引用检测方法的步骤。
上述技术方案的有益效果是:
本发明通过符号表达式图分析程序中的主调函数和被调函数中的空指针解引用错误,提高了检测空指针解引用的效率,并且能够生成被调函数的摘要而后将被调函数的摘要嵌入主调函数从而进一步提高了程序中的空指针解引用的效率。
本发明的其它特征和优点以及本发明的各种实施例的结构和操作,将在以下参照附图进行详细的描述。应当注意,本发明不限于本文描述的具体实施例。在本文给出的这些实施例仅仅是为了说明的目的。
附图说明
通过阅读参照以下附图对非限制性实施例所作的详细描述,本发明的其它特征、目的和优点将会变得更明显。
图1为使出了根据本发明的一个实施例的过程间的空指针解引用检测方法流程示意图;
图3A-3B示出了根据本发明的一个实施例的预建模阶段中展开循环的一个例子;
图4示出了一段示例代码及其未修剪的HSSA形式;
图5示出了根据本发明的一个实施例生成的示例性的SEG;
图6A-6B示出了为上述代码片段生成SEG图的示意图;
图7A-7E示出了遍历SEG图,以对示例程序进行缺陷检测的示意图;
图8示出了本发明的一个实施例中的待检测程序的函数调用图;
图9示出了本发明的一个实施例中的过程间的空指针解引用检测系统结构图。
从以下结合附图的详细描述中,本发明的特征和优点将变得更加明显。贯穿附图,相同的附图标识相应元素。在附图中,相同附图标记通常指示相同的、功能上相似的和/或结构上相似的元件。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动的前提下所获得的所有其他实施例,都属于本发明保护的范围。
本公开中使用的“第一”、“第二”以及类似的词语并不表示任何顺序、数量或者重要性,而只是用来区分不同的组成部分。“包括”或者“包含”等类似的词语意指出现该词前面的元件或者物件涵盖出现在该词后面列举的元件或者物件及其等同,而不排除其他元件或者物件。“连接”或者“相连”等类似的词语并非限定于物理的或者机械的连接,而是可以包括电性的连接,不管是直接的还是间接的。“上”、“下”、“左”、“右”等仅用于表示相对位置关系,当被描述对象的绝对位置改变后,则该相对位置关系也可能相应地改变。
需要说明的是,在不冲突的情况下,本发明中的实施例及实施例中的特征可以相互组合。
下面结合附图和具体实施例对本发明作进一步说明,但不作为本发明的限定。
本发明提供一种过程间的空指针解引用检测方法。
图1为一种过程间的空指针解引用检测方法流程示意图。过程间的空指针解引用检测方法包括:步骤S101、步骤S102、步骤S103、步骤S104以及步骤S105。在步骤S101中,对待检测程序进行预处理。步骤S102中,生成待检测程序中的主调函数和被调函数的符号表达式图,符号表达式图包括值节点、运算符节点,以及连接节点的数据依赖性边和控制依赖性边,其中,值节点包括终端值节点和非终端值节点,终端值节点表示当前函数外生成的未知的值或常量,非终端值节点表示当前函数内生成的值,并且每个非终端值与一个唯一的内存地址相关联,数据依赖性边是将节点连接到与其有直接数据依赖关系的值节点的有方向性的边(有向边),控制依赖性边是当存在限定变量的条件时将变量连接到条件的有向边。在步骤S103中,根据被调函数的符号表达式图对被调函数进行过程内分析,以检测被调函数中的空指针以及生成被调函数的函数摘要。在步骤S104中,将被调函数的函数摘要嵌入主调函数。在步骤S105中,根据主调函数的符号表达式图对主调函数进行过程内分析,以检测主调函数中的空指针解引用。
图2为一些实施例中的一种过程内的空指针解引用缺陷检测方法的流程图。通过该过程内的缺陷检测方法来进行过程内分析,即检测主调函数或被调函数中空指针解引用错误。该过程内的缺陷检测方法包括:S201,对待检测的程序进行预处理;S202,生成待检测程序的符号表达式图,符号表达式图包括值节点、运算符节点,以及连接节点的数据依赖性边和控制依赖性边,其中,值节点包括终端值节点和非终端值节点,终端值节点表示当前函数外生成的未知的值或常量,非终端值节点表示当前函数内生成的值,并且每个非终端值与一个唯一的内存地址相关联,数据依赖性边是将节点连接到与其有直接数据依赖关系的值节点的有向边,控制依赖性边是当存在限定变量的条件时将变量连接到条件的有向边;以及,S203,从空指针结点开始对符号表达式图(SEG)向后进行深度优先遍历,在发现空指针解引用时生成错误报告。
在S204,当检测到空指针时,为该空指针对应的空指针结点生成约束;到达空指针解引用地址,添加约束,并在步骤S205检查是否满足约束。如果在S205为否,则返回S203继续遍历SEG。如果在S205为是,则在S206生成错误报告,然后从空指针解引用地址返回到追溯点,并弹出解引用地址的约束。之后,返回S203,继续搜索空指针解引用地址,直到该符号表达式图遍历完成。其中,控制依赖性边指向的一侧为逻辑运算的运算符或布尔值节点。用真和假来标记控制依赖性边,以表明逻辑运算的所需的结果。待检测程序是程序片段,并且符号表达式图是从底层向上构建的。
图2示出的过程内的缺陷检测方法,其中预处理包括展开程序中的循环。
下面,结合附图简要介绍提出的过程内的缺陷检测方法总体框架。该算法主要包括四个阶段:预建模(Pre-model)、先决分析(Prerequisite Analysis)、后建模(Post-model)和缺陷分析(Defect analysis)。
在预建模阶段,主要从输入的程序中消除不感兴趣的结构,以简化后续分析。例如,循环展开、循环打破等都是在这个阶段执行的。
接下来,在先决分析阶段,计算基本信息,特别是该阶段的后续分析中所需的整个程序信息。根据先决分析结果,生成调用图。调用图是本领域中常用的用来描述程序结构的图,这里不再详述。
接着,在后建模阶段,使用先决分析阶段生成的调用图来进一步简化代码,并更新程序信息。例如,标记调用图中形成SCC(强连通分量)的调用边,以便将来在不必进入循环的情况下,就能够对调用图中的迭代进行分析。
最后,在缺陷分析阶段,主要算法是符号值流分析(SVFA),生成函数摘要信息,以完成函数内分析。此时,这些指针的值仍然是未知的。对符号指针表示图(SPEG)IR(中间语言)执行SVFA,其中SPEG IR对点对关系(左值依赖)和变量的符号值(右值依赖)一起进行建模,可得到符号表达式图(SEG)。该SEG是本发明中提出的一种全新的数据结构,下面将更加详细地描述SEG的生成过程和利用SEG进行缺陷检测的方法。
本发明中提出的SEG能够紧凑地将每个变量的值表示为外部存储器位置的变量的逻辑和算数表达式,例如,参数、全局变量和通过参数和全局变量可达的堆位置。SEG是一种有向无环图(简称DAG),是对所有变量的一种完整SSA表示。通过前向路径敏感的分析,从下向上构建SEG,因此可以递增地评估SAT查询。还因为SEG的DAG性质,我们可以将特定的SEG子图替换为常数表示以加速约束解析。
使用SEG的流水线工作流程是非常灵活的,我们可以简单地添加更多阶段来实现特定功能。例如,将来我们可以将分析过程分阶段化,逐渐使用更准确的分析来细化错误报告。每个分析阶段仅验证来自上一个阶段的错误候选者。我们可以通过在预建模阶段和缺陷分析阶段之间添加一组阶段来实现这种功能。
下面将介绍每个阶段中实现的主要算法,并重点介绍符号值流分析(SVFA)。应理解,本文中提供的实例和细节仅是为了帮助理解,而不以任何方式对本发明的范围构成限制。
预建模阶段
在预建模阶段,例如,可使用开源的LLVM转换来对程序进行建模。表1示出了这里使用的LLVM转换流程的完整列表。
表1:
Figure GDA0001883826260000101
在该阶段中,我们的主要任务是展开和打破所有的循环,根据循环嵌套结构,从内环到外环。近似循环对于有界模型检查至关重要,展开循环是最简单也是最粗暴的方式。在图3A和3B中示出了展开循环的一个例子。
图3A示出了展开循环之前的循环,该循环为规范的形式:该循环具有预读头部(Pre-header),并且只有一个调用锁存的节点能够返回到头部(header)。虚线箭头将循环内部存在的节点连接到循环外部的退出节点(exit node),并且所有退出节点都被布置了足够的φ函数,以保护来自循环的定义。当然,虚线箭头表示该条边并不存在。通过首先复制循环体(loop body)K次,然后为克隆的变量更新定义-使用(def-use)关系,来执行展开循环K次。
图3B示出了将图3A中的循环展开两次的结果,即,复制了两次。我们对代码执行三种类型的更新。首先,将来自第i个循环的锁存(latch)复制到第i+1个循环的头部,为所有头部复制和更新φ函数。其次,将新的值插入被克隆的变量的退出节点的φ函数中。接下来,从头部的锁存去除后边缘。这时,如果锁存不能退出循环,则变为悬挂节点,我们为锁存附加一个不可达的指令,并依赖死代码消除来清理无用的变量。
先决分析阶段
该阶段主要设置来收集全局程序信息。要收集的非常基本的信息是调用图。我们使用传统指针分析方法来计算调用图,这里不再描述其细节。然而,我们仅使用自下向上的方法,这对于生成调用图是至关重要的,因为自上向下的方法速度过慢。
后建模阶段
我们在先决分析之后插入另一个编码建模阶段,提供进一步简化的代码在缺陷分析阶段使用。在该阶段执行的所有算法都是响应于全局程序信息的更新,如果该信息有改变的话。在后建模阶段,不仅可以实现调用图SCC标记分析,如上文,标记在调用图中形成循环的后沿,还可以通过缺陷分析来利用这些信息来计算循环中函数的有界分析结果。可选地,还可以在该阶段增加其他重要的变换,如,常数传播(constant propagation)等。
缺陷分析阶段
在该实施例中,缺陷分析的算法设计如下:
<Type(τ)>::=bool|int|{(f1,τ1),...,(fn,τn)}|τ[]|τ*
<Obj(o)>::=v|{(f1,o1),...,(fn,on)}
<Deref(m)>::=*υ|υ→f1.f2 ... fn
<Expr(e)>::=null|const(n,τ)|unknown(τ)|parm(τ)|global(τ)
|&o|&m|new...
|o|m|e1 binop e2|-e|(τ)e
<Cond(c)>::=false|true|!c|c1 and c2|c1 or c21 comp υ2
<Stmt(s)>::=o←e|m←o|ite(c,Label-T,Label-F)|assert(c)|assume(c)
<binop>::={+,-,×,/,mod,band,bor,bxor}
<comp>::={=,<,≥,>,≤,≠}
该示例性算法的源代码的语法定义如上所示,其中ite是if-then-else的缩写。该算法的第一条规则定义了该算法建模的类型,支持两种元素类型:布尔型和整型。在基本类型的基础上定义了C结构(C struct)、数组(array)和指针(pointer)等复合类型。应注意,当前算法中没有对浮点算术进行建模,尽管约束求解器Z3已经添加了对浮点数的支持。所有浮动变量都可以转换为整数变量,并将其整数值建模为未知数。
其余规则定义了变量和变量组成的表达式。具体来说,该算法支持多步指针表达式v→f1.f2…fn,为未初始化变量和浮动变量建模的unknown值,函数参数的parm值,以及全局变量的global值。由于LLVM通过插入临时变量将长表达式转化为短表达式,因此,在此基础上,还可以将存储和加载语句写为*(p+f)=v和v=*(p+f),其中f是基本指针p的偏移量。
下面,将结合实例介绍根据本发明的基于可能的混叠分析的空指针引用(NPD)方法。
程序内分析通过执行价值流分析(value flow analysis),在函数内找到条件为null的空指针。
价值流分析
下面给出示例性的价值流分析(VFA)的抽象域定义:
Figure GDA0001883826260000121
VFA的任务是计算一个抽象存储位置可能具有的抽象值集合,即,如上所示的δ函数。抽象值是分析涉及的具体值的抽象表示。VFA还计算抽象位置具有给定的抽象值时的条件。计算结果被表示为函数。为了简单起见,我们还将条件位置值对写为
Figure GDA0001883826260000122
其中
Figure GDA0001883826260000123
并且
Figure GDA0001883826260000124
作为例子,我们可以选择SSA作为制定VFA的开始,因为SSA能够支持稀疏分析,从而可以显着提高分析性能。然而,由LLVM构建的SSA只是转换了顶级变量,即,那些没有被指针指向的变量。堆内存位置也被LLVM忽略,因此堆内存位置之间的值流是不清楚的。因此,尝试解析指针表达式来构造一个完全编码所有内存位置的def-use关系的SSA形式。
这里的核心问题是分解负载和存储语句。假设指针p指向在可能的混叠分析阶段获得的对象o1,o2,…,ok,则一个直接的因式分解方法是:
对于*(p+f)=v,可以用对象字段的一组直接赋值来替换它:o1.f=v,o2.f=v,...,ok.f=v。
对于v=*(p+f),可以用赋值υ=χ(o1.f,o2.f,…,ok.f)替换它。函数χ表示其参数之一可以赋值给v。
对象字段的因式分配由其原始指针表达式来注释,我们将访问这些表达式,以进行空指针引用检查。我们将数组建模为单个单元,因此,数组的每个加载和存储将被重定向到该单个单元。在完成对存储和加载的翻译之后,恢复对变量的所有可能的赋值。然后,我们运行标准的SSA构造算法来插入对象域的φ函数。所得到的IR称为完全基于堆的SSA(HSSA)。HSSA的一个例子如图4所示,在下文中将结合这个例子继续解释本发明的原理。
图4示出了一段示例代码及其未修剪的HSSA形式。
接下来,我们将图4所示的HSSA IR转换成图形形式,揭示价值计算结构,如,在抽象语法树中。我们称之为图形表示符号表达式图(SEG)。SEG是本发明提出的一种全新的数据结构。
图5示出了根据本发明的一个实施例生成的示例性的SEG。其中,灰色椭圆形节点表示终端值,未着色的椭圆形节点表示非终端值。实线和虚线代表数据和控制依赖性边。每个非终端值附加到控制依赖性边,以表示该值有效的条件。控制依赖性边的标签代表我们对条件的期望。为了清楚起见,忽略标记为true的控件依赖性边。在图4中,运算符用矩形灰色节点表示。
形式上,SEG是一个4元组(V,O,D,C)。其中,V是一组值节点,节点的值分为终端值和非终端值。终端值表示在此函数之外生成的未知值。在该设计中,此函数可访问的参数、全局变量和堆位置的值是终端值,它们表示为图6底部的灰色节点。图6中的椭圆形节点是非终端值,表示在此过程中生成的值。由于SEG的SSA性质,我们还将唯一的内存位置与每个非终端值相关联,以将该值命名。O表示该算法中定义的所有运算符的运算符节点集合。D是一组数据依赖性边,在图4中以实线表示。C是一组控制依赖性边,在图5中以虚线表示。箭头侧的节点必须是逻辑运算的运算符节点。我们还用true或false来注释边,以表示逻辑运算的所需结果。
终端值的集合也称为接口对象(IO),它们的正式定义如下:
<PIO>::=parami|global
<IO>::=PIO|*IO|IO→f|IO.f
其中,PIO表示主接口对象。在PIO的语法中,parami是函数的第i个参数,global是全局变量。IO的递归部分是通过以PIO作为根的指针取解引用可访问的存储器位置,例如,<o1.f>0和<o2.f>0。在当前的NPD算法中,我们将IO的值视为符号值,而不会跟踪全局信息流。
如下所示的算法1给出了构建SEG的伪代码。
Figure GDA0001883826260000151
该算法以反向顺序(RPO)迭代基本块。对于每个基本块B,我们首先构建其路径条件
Figure GDA0001883826260000152
其是对于来自
Figure GDA0001883826260000153
的所有路径p的路径约束
Figure GDA0001883826260000154
的分离。然而,这种路径条件可能非常冗长。压缩路径条件的想法是以递归形式重写其定义:
Figure GDA0001883826260000155
其中Bif是B的控制依赖基本块,
Figure GDA0001883826260000156
是使程序执行从Bif到B的条件。在算法1中,函数GetBBCond(b)返回一对值(l,cin),其中l是true或false标签,cin是B所依赖于的if条件。可以使用控制依赖图来容易地实现GetBBCond函数。
接下来,我们按顺序对每个基本块中的语句进行符号评估,并调用函数FindCreateExpr来逐步构建SEG。FindCreateExpr接受三个参数,它们是:运算符、操作数列表和路径条件。最相关的构造是φ函数。我们必须计算门控函数γ,其中,γi是选择φ函数的第i个元素的条件。使用下面的定理可以导出门控函数:
假设xn=φ(x1,x2,…,xk),
则有
Figure GDA0001883826260000161
其中,Predi(B)是B的第i个前导基本块。
如上,我们可以使用示例性的算法1构建根据本发明的SEG。由算法1构建的SEG具有三个特征:
1.我们将因子赋值解释为对象字段,作为强更新。例如,<o1.f>1不保留值<o1.f>0。目的是用稳健性换取精确性。
2.SEG是一个最大共享的图,SEG的每一个子图是唯一的,即,SEG没有同构子图。FindAndCreateExpr函数可以避免相同的子图。一个例子是节点<o1.f>3和<o2.f>3,它们共享相同的子图。
3.由不同if语句中的两个或多个逻辑运算组成的路径条件紧凑地表示为逻辑运算控制依赖于另一逻辑运算。例如,!=运算符控制取决于<=运算符,它编码语句中的条件if(b<=0)和if(q!=NULL)。
重构每个变量的计算过程的原因是我们可以轻松地发现不可行的路径,并通过解析约束来排除错误的信息流。在我们的例子中,if(c>a)和if(b≤0)的分支是不能同时进行的。我们可以发现这个事实,因为查询SAT((c1=a0+b0)∧(c1>a0)∧(b00))为false。
在下面的算法2中描述了使用SEG来确定NULL值存储器位置的有效方法。
Figure GDA0001883826260000162
该算法是从NULL递归访问节点,从而为每个内存位置n计算Null值条件(NullCond(n))。这种方法的优点有两个方面。首先,可以利用Z3的增量解析能力,递增地将节点的控制依赖性添加到从第12行中的子节点上升的约束。因此,对第13行中的约束进行评估可以借用Z3缓存的中间结果来评估孩子节点。其次,第13行SAT查询确保添加到第18行中的NullCond[n]的子约束真的可以导致Null值。
我们可以用NullCond(n)报告程序内的NPD错误。对于可能为NULL的每个指针p,在路径条件ψ下,访问包含解引用的指针*(p+f)的所有语句。如果SAT(NullCond(p)∧p=NULL∧ψ),则我们报告错误。当空指针检查p≠NULL是ψ的一部分时,可以故意添加约束p=NULL以避免false警报。
面结合一个具体实例来介绍图2示出的过程内的空指针解引用缺陷检测方法。
我们使用一段代码作为一个例子,该段代码片段包括三个语句:
Z=φ(Z1,B1;null,B2);
if(Z)X=Y+3;
if(X>3)*Z;
其中,第一个语句Z=φ(Z1,B1;null,B2)表示在输入为B1情况下,Z=Z1;在输入为B2情况下,Z为空。第二个语句if(Z)X=Y+3表示在Z不为空的情况下,即,B1情况下,计算X的值,如果Z不为空则X=Y+3。在Z为空的情况下,则X没有被赋值。第三个语句if(X>3)*Z表示在X大于3的情况下解引用Z。
为上述待检测程序生成符号表达式图。如上文,符号表达式图包括值节点、运算符节点,以及连接节点的数据依赖性边和控制依赖性边,其中,值节点包括终端值节点和非终端值节点,终端值节点表示当前函数外生成的未知的值或常量,非终端值节点表示当前函数内生成的值,并且每个非终端值与一个唯一的内存地址相关联,数据依赖性边是将节点连接到与其有直接数据依赖关系的值节点的有向边,控制依赖性边是当存在限定变量的条件时将变量连接到条件的有向边。
图6A-6B示出了为上述代码片段生成SEG图的示意图。首先,如图6A所示,对于第一个语句,Z=φ(Z1,B1;null,B2),为变量Z构建一个节点,并使用箭头61和62分别将Z节点连接到Z1和nil(空指针),该箭头代表数据依赖关系,我们将图6A中的箭头61和62称之为数据依赖性边。
对于第二个语句if(Z)X=Y+3,类似地,为变量X和Y、常数3、运算符+各构建一个节点,并用数据依赖性边连接这些节点。因为对X进行定义是有条件的,我们用控制依赖性边来将变量X连接到条件,在图7B中以虚线箭头示出。实际上,每个节点都具有控制依赖性边,指向节点可以被定义的条件。
最后一个语句if(X>3)*Z,在满足特定条件,即,X>3,的情况下,将节点*Z(Z的解引用)连接到Z。得到的SEG图如图6B所示。
接下来,使用如上构建的SEG图来进行缺陷检测即检测空指针解引用。通过在SEG图中从每个空指针源到每个解引用点进行搜索,可以找到空指针解引用。从图7A开始,从空节点开始沿着数据依赖性边,对SEG进行深度优先遍历。在该实例中,首先,如图7B所示,搜索空指针找到Z节点,并为Z=null生成约束71,即,该约束条件为B1。然后,如图7C所示,搜索解引用点,添加约束72并检查约束是否被满足。如果满足,则生成错误报告。
在访问解引用点之后,返回到追溯点Z,而不必从头开始遍历。在Z点处,为解引用点弹出(即,去掉)上一个约束条件72,结果如图7D所示。然后,如图7E所示,继续搜索其它空指针解引用地址并添加约束条件73,直到该SEG遍历完成为止。应注意,在访问解引用点之后不必从最开始的点搜索和构建约束。
图2~图7D示出的是一些实施例中的对函数进行过程内分析的过程。下面结合附图来阐述过程间的空指针解引用检测方法。
再次参考附图1,在步骤101中,对需要进行空指针检测的程序进行预处理,该程序中包括多个函数,并且函数之间存在调用关系。通过预处理过程,可以获得待检测程序的函数调用图,从而根据函数调用图来确定主调函数和被调函数。
在步骤S102中,生成待检测程序中的主调函数和被调函数的符号表达式图。符号表达式图包括值节点、运算符节点,以及连接节点的数据依赖性边和控制依赖性边,其中,值节点包括终端值节点和非终端值节点,终端值节点表示当前函数外生成的未知的值或常量,非终端值节点表示当前函数内生成的值,并且每个非终端值与一个唯一的内存地址相关联,数据依赖性边是将节点连接到与其有直接数据依赖关系的值节点的有向边,控制依赖性边是当存在限定变量的条件时将变量连接到条件的有向边。各个函数的符号表达式图的生成过程可以参考图2~图7E以及其对应的内容部分。
参考附图8,图8为一种待检测程序(程序1)中的函数调用图。图8中示出的待检测程序的函数调用图包括函数main、f1、f2、f11以及f12,这些函数的调用关系如图8所示。
在步骤S103中,根据被调函数的符号表达式图对被调函数进行过程内分析,以检测被调函数中的空指针以及生成被调函数的函数摘要。从函数f11和f12分析,并在分析过程中生函数摘要,即根据函数调用图进行自底向上的生成函数摘要并上传到上一层的主调函数,即生成f11和f12的函数摘要后,嵌入函数f1,再生成函数f1的函数摘要,而后将函数f1的函数摘要传递给main函数即嵌入main函数。
函数摘要分为函数摘要包括符号摘要、输入摘要以及输出摘要。通过被嵌入后的输入摘要获得被调函数中的空指针解引用并生成第一错误报告。通过被嵌入后的输出摘要获得被调函数的输出变量的空指针解引用并生成第二错误报告。符号摘要用于向主调函数传递实例化后的被调函数的输出变量。
参考图8,图8中的函数f2指代的函数的代码为:
Figure GDA0001883826260000201
通过步骤S103对函数f2进行过程内分析检测其中的空指针解引用以及生成函数摘要。
下述的算法3为生成被调函数f2的函数摘要的伪代码。
Figure GDA0001883826260000202
在算法3中,生成符号摘要的过程为,根据被调函数f2的符号表达式图获得被调函数的输出变量,以及输出变量的路径约束;根据被调函数反f2的输出变量和输出变量的路径约束生成被调函数的符号摘要。符号摘要为符号摘要为一三元组<I,O,C>,其中:I为被调函数的输入变量集合(inputs),O为被调函数的输出变量集合(outputs),C为路径约束集合(constraints)。
获得的被调函数f2符号摘要为:
Figure GDA0001883826260000211
在被调函数f2中,约束(constraints)包括约束1:return=(arg3>0)?arg4;nullptr;约束2:global1=(arg3>0)?f:global1;约束3:global2=2。输出变量(outputs)包括:eturn,global1,global2。输入变量包括arg3,arg4,global1。
被调函数f2中的输入摘要为一五元组<I,C,R,D,S>,其中:R为报告键值(report),I为输入变量(Input),C为路径约束(Constraints),D为摘要描述(Trace),S为检查特定信息(checkerspecificData)。输入摘要通过以下步骤获得:从空指针节点开始对被调函数f2的符号表达式图向后进行深度优先遍历,以获得被调函数中的发生空指针解引用的第一变量。第一变量是函数f2中的所有可能发生空指针解引用的变量。根据第一变量生成空指针解引用错误报告。若第一变量的路径约束中包括被调函数的输入变量,则根据被第一变量生成输入摘要。在被调函数f2中,分别对变量arg1,arg2,gloabl1进行了解引用,因此存在解引用arg1,arg2,global1的空指针解引用错误报告,即arg1,arg2,global1发生了空指针解引用,而发生空指针解引用的路径约束中包括输入变量时,则生成以该第一变量为报告键值的输入摘要。当约束2中的arg3>0时,print(“%d”,*arg1)这行代码解引用了arg1,此时的检查特定信息S为要求arg1为空指针,输入摘要的摘要描述(D)为trace,即跟踪到这行代码,arg1=>printf("%d",*arg1)。变量arg2,global1对应的输入摘要与arg1的输入摘要的相同,在此不再赘述。以上三个输入摘要组成了函数f2的输入摘要的集合。通过上述方法,被调函数f2的三个输入摘要分别为:
{report:deref arg1
Input:{arg3}
Constraints:arg3>0
checkerspecificData:require arg1 is nullptr
Trace:ARGUMENT arg1=>printf("%d",*arg1)
},
{report:deref arg2
Input:{arg3}
Constraints:arg3>0
checkerspecificData:require arg2 is nullptr
Trace:ARGUMENT arg1=>printf("%d",*arg2)
},
{report:deref global1
Input:{arg3}
Constraints:arg3>0
checkerspecificData:require global1 is nullptr
Trace:printf("%d",*global1)
}。
输出摘要为一四元组<I,C,D,S>,其中:I为一输入变量(input),C为路径约束集(constraints),D摘要描述(trace),S为检查特定信息(checkerspecificData)。获得的输出摘要的步骤为,根据输出变量的路径约束,判断输出变量是否存在发生空指针解引用的路径:若存在,则根据输出变量和路径约束生成被调函数的输出摘要。对于被调函数,当其返回值(输出变量)被主调函数调用,就有可能发生空指针解引用。被调函数f2中,输出变量包括return、global1以及global2,根据约束3(global2=2)的global2的值为固定值,不存在发生空指针解引用的路径,所以不会被赋予空指针,也就不生成关于global2输出摘要。约束1(return=(arg3>0)?arg4;nullptr)中,当arg3>0时,输出变量return被赋值为arg4,故当约束arg3>0满足并且arg4为空指针时,将在代码Return(arg3>0)?arg4:nullptr中返回空指针,此时摘要描述(trace)根据这一行代码生成即ARGUMENT arg4=>return arg4。同样的,约束1(return=(arg3>0)?arg4;nullptr),arg3<0时,return也返回了空指针,所以根据约束1和该输出变量生成一个输出摘要。被调函数f2中有三个输出摘要,依次为:
Figure GDA0001883826260000231
再次参考附图1,步骤S104中,将被调函数的函数摘要嵌入主调函数。通过上述步骤生成了被调函数f2的函数摘要。在步骤S104中,将上述生成的函数摘要嵌入主调函数(main)中,嵌入函数摘要过程通过算法4来展示,算法4的伪代码如下所示:
Figure GDA0001883826260000241
再次参考附图8和算法4,在对主调函数(main)进行分析时,需要将被调函数(f2)内嵌到主调函数(main)中。我们首先进行输入摘要的嵌入,即将输入摘要实例化,若输入摘要中的路径约束为真并且检查特定信息为真,则生成输入摘要对应的第一错误报告。将输入摘要实例化,就是将根据主调函数的上下文,将输入摘要进行实例化即将具体数值带入输入摘要,再判断输入摘要中的路径约束为真并且检查特定信息是否同时为真。当输入摘要中的路径约束为真并且检查特定信息为真时,则说明被调函数中该输入摘要对应的变量存在空指针解引用,生成该变量的空指针解引用错误报告作为第一错误报告。
实现了输入摘要的嵌入之后,可以进行符号摘要的嵌入,即将符号摘要实例化,获得被调函数的输出变量的值并传递至述主调函数。实例化就是根据主调函数(main)的上下文,将被调函数f2中的输入变量进行赋值之后根据符号摘要中的路径约束(Constraints)可以获得被调函数的输出即输出变量的值。
将被调函数f2的符号摘要嵌入之后,进行输出摘要的嵌入,即将输出摘要实例化,若输出摘要中的路径约束为真和检查特定信息检测为真,则生成输出摘要对应的第二错误报告。将输出摘要进行实例化之后,检测每个输出摘要中的路径约束(Constraints)和检查特定信息(checkerspecificData),若述路径约束为真和检查特定信息检测为真,则说明该输出摘要对应的输出变量此时发生空指针解引用,生成一个关于该输出变量空指针解引用错误报告即第二错误报告。
在一些实施例中,首先,通过被嵌入后的输入摘要获得被调函数中的空指针解引用并生成第一错误报告;然后,通过被嵌入后的输出摘要获得被调函数的输出变量的空指针解引用并生成第二错误报告;最后,将符号摘要用于向主调函数传递实例化后的被调函数的输出变量。
在步骤S105中,根据主调函数的符号表达式图对主调函数进行过程内分析,以检测主调函数中的空指针解引用。完成被调函数(f2)的嵌入后,对主调函数进行过程内分析。根据主调函数(main)的符号表达式图对主调函数进行过程内分析,检测主调函数中的空指针解引用错误。
在一些实施例中,先进行主调函数(main)的过程内分析,在主调函数的过程内分析的过程中,发生函数调用时再将被调函数嵌入。
在一些实施例中,待检测程序(程序2)的代码可以为:
Figure GDA0001883826260000251
根据上述程序2的代码,函数B的函数摘要为:
Figure GDA0001883826260000261
在程序2中,在对函数B进行空指针解引用检测时,函数B不存在空指针解引用,所以函数B输入摘要和输出摘要均为空,因为函数B执行结果为返回一个!cond值,所以生成一个符号摘要,内容是函数B的返回值为第一个参数取非。之后,在对函数A进行空指针解引用检测时,检测到b2时,通过符号摘要,以及参数cond=b1,为true,推导出b2=false,这样这个空指针问题是不存在的,因为只有b2=true的时候空指针才能被使用到。如果没有这个函数B的符号摘要,即对函数B的分析结果,就无法确定b2的值,这样b2=true就有可能成立,就会产生空指针解引用(NPD)的误报。
在一些实施例中,可以采用算法5中的伪代码表示的嵌入方法。即可以应用PushConstraints(约束压栈)→inline(嵌入)→PopConstraints(约束弹栈)策略来进行增量约束。例如:为了内嵌输出摘要时,我们首先将具有相同的checkerspecificdata(检查特定信息)的输出摘要合并成一个摘要,并把约束看作是true。当要生成报告时,我们检查输出摘要的路径约束通过应用PushConstraints→inline→PopConstraints,从而实现增量解决。增量约束是指用一个栈来记录这些路径约束,遇到需要的路径约束就压入栈,不需要的约束就弹出栈,结构特征和普通的数据结构栈一样。算法5的伪代码为:
Figure GDA0001883826260000271
参考图9,根据本发明的一个方面,提供一种过程间的空指针解引用检测系统300,包括:
预处理模块301,对待检测程序进行预处理;
表达式生成模块302,生成待检测程序中的主调函数和被调函数的符号表达式图,符号表达式图包括值节点、运算符节点,以及连接节点的数据依赖性边和控制依赖性边,其中,值节点包括终端值节点和非终端值节点,终端值节点表示当前函数外生成的未知的值或常量,非终端值节点表示当前函数内生成的值,并且每个非终端值与一个唯一的内存地址相关联,数据依赖性边是将节点连接到与其有直接数据依赖关系的值节点的有向边,控制依赖性边是当存在限定变量的条件时将变量连接到条件的有向边;
摘要生成模块303,根据被调函数的符号表达式图对被调函数进行过程内分析,以检测被调函数中的空指针以及生成被调函数的函数摘要;
嵌入模块304,将被调函数的函数摘要嵌入主调函数;
分析模块305,根据主调函数的符号表达式图对主调函数进行过程内分析,以检测主调函数中的空指针解引用。
根据本发明的一个方面,提供一种过程间的空指针解引用检测设备,包括:
处理器;
存储器,其中存储有处理器的可执行指令;
其中,处理器配置为经由执行可执行指令来执行上述过程间的空指针解引用检测方法的步骤。
根据本发明的一个方面,提供一种计算机可读存储介质,用于存储程序,其特征在于,程序被执行时实现上述过程间的空指针解引用检测方法的步骤。
综上,本发明通过符号表达式图分析程序中的主调函数和被调函数中的空指针解引用错误,提高了检测空指针解引用的效率,并且能够生成被调函数的摘要而后将被调函数的摘要嵌入主调函数从而进一步提高了程序中的空指针解引用的效率。
以上内容是结合具体的优选实施方式对本发明所作的进一步详细说明,不能认定本发明的具体实施只局限于这些说明。对于本发明所属技术领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干简单推演或替换,都应当视为属于本发明的保护范围。

Claims (20)

1.一种过程间的空指针解引用检测方法,其特征在于,包括:
对待检测程序进行预处理;
生成所述待检测程序中的主调函数的符号表达式图和被调函数的符号表达式图,所述符号表达式图包括值节点、运算符节点,以及连接节点的数据依赖性边和控制依赖性边,其中,值节点包括终端值节点和非终端值节点,终端值节点表示当前函数外生成的未知的值或常量,所述终端值节点包括当前函数可访问的参数、全局变量和堆位置的值,非终端值节点表示当前函数内生成的值,并且每个非终端值与一个唯一的内存地址相关联,所述数据依赖性边是将节点连接到与其有直接数据依赖关系的值节点的有向边,所述控制依赖性边是当存在限定变量的条件时将变量连接到条件的所述有向边,所述控制依赖性边对应的箭头侧的节点是运算符节点;
根据所述被调函数的符号表达式图对所述被调函数进行过程内分析,以检测所述被调函数中的空指针以及生成所述被调函数的函数摘要;
将所述被调函数的所述函数摘要嵌入所述主调函数;
根据所述主调函数的符号表达式图对所述主调函数进行过程内分析,以检测所述主调函数中的空指针解引用。
2.根据权利要求1所述的过程间的空指针解引用检测方法,其特征在于,所述函数摘要包括符号摘要、输入摘要以及输出摘要;所述将所述被调函数的所述函数摘要嵌入所述主调函数,还包括:
通过被嵌入后的所述输入摘要获得所述被调函数中的空指针解引用并生成第一错误报告;
通过被嵌入后的所述输出摘要获得所述被调函数的输出变量的空指针解引用并生成第二错误报告;
所述符号摘要用于向所述主调函数传递实例化后的所述被调函数的所述输出变量。
3.根据权利要求2所述的过程间的空指针解引用检测方法,其特征在于,所述根据所述被调函数的符号表达式图对所述被调函数进行过程内分析,以检测所述被调函数中的空指针以及生成所述被调函数的函数摘要,具体包括以下步骤:
从空指针节点开始对所述被调函数的所述符号表达式图向后进行深度优先遍历,以获得所述被调函数中的发生空指针解引用的第一变量;
根据所述第一变量生成空指针解引用错误报告;
若所述第一变量的路径约束中包括所述被调函数的输入变量,则根据所述第一变量生成所述输入摘要。
4.根据权利要求3所述的过程间的空指针解引用检测方法,其特征在于,所述输入摘要 为一五元组
Figure 337287DEST_PATH_IMAGE001
其中:R为报告键值,I为输入变量,C为路径约束集,D为摘要描 述,S为检查特定信息。
5.根据权利要求2所述的过程间的空指针解引用检测方法,其特征在于,所述根据所述被调函数的符号表达式图对所述被调函数进行过程内分析,以检测所述被调函数中的空指针以及生成所述被调函数的函数摘要,具体包括以下步骤:
根据所述被调函数的所述符号表达式图获得所述被调函数的输出变量,以及所述输出变量的路径约束;
根据所述被调函数的所述输出变量和所述输出变量的所述路径约束生成所述被调函数的符号摘要。
6.根据权利要求5所述的过程间的空指针解引用检测方法,其特征在于,所述符号摘要 为一三元组
Figure 425329DEST_PATH_IMAGE002
,其中:I为所述被调函数的输入变量集合,O为所述被调函数的输出 变量集合,C为路径约束集合。
7.根据权利要求2所述的过程间的空指针解引用检测方法,其特征在于,所述根据所述被调函数的符号表达式图对所述被调函数进行过程内分析,以检测所述被调函数中的空指针以及生成所述被调函数的函数摘要,具体包括以下步骤:
根据所述输出变量的路径约束,判断所述输出变量是否存在发生空指针解引用的所述路径约束:
若存在,则根据所述输出变量和所述路径约束生成所述被调函数的所述输出摘要。
8.根据权利要求7所述的过程间的空指针解引用检测方法,其特征在于,所述输出摘要 为一四元组
Figure 223521DEST_PATH_IMAGE003
,其中:I为一输入变量,C为路径约束集,D摘要描述,S为检查特定信 息。
9.根据权利要求4所述的过程间的空指针解引用检测方法,其特征在于,所述将所述被调函数的所述函数摘要嵌入所述主调函数,包括以下步骤:
将所述输入摘要实例化,若所述输入摘要中的所述路径约束为真并且所述检查特定信息为真,则生成与所述输入摘要对应的所述第一错误报告。
10.根据权利要求6所述的过程间的空指针解引用检测方法,其特征在于,所述将所述被调函数的所述函数摘要嵌入所述主调函数,还包括:
将所述符号摘要实例化,获得所述被调函数的所述输出变量的值并传递至述主调函数。
11.根据权利要求8所述的过程间的空指针解引用检测方法,其特征在于,所述将所述被调函数的所述函数摘要嵌入所述主调函数,还包括:
将所述输出摘要实例化,若所述输出摘要中的所述路径约束为真和所述检查特定信息检测为真,则生成所述输出摘要对应的第二错误报告。
12.根据权利要求1所述的过程间的空指针解引用检测方法,其特征在于,在所述根据所述主调函数的符号表达式图对所述主调函数进行过程内分析,以检测所述主调函数中的空指针解引用中,
当检测到空指针时,为该空指针对应的空指针节点生成约束;
到达空指针解引用地址,添加约束,并检查是否满足约束,如果是,则生成错误报告。
13.根据权利要求12所述的过程间的空指针解引用检测方法,其特征在于,所述根据所述主调函数的符号表达式图对所述主调函数进行过程内分析,以检测所述主调函数中的空指针解引用,还包括:
从空指针解引用地址返回到追溯点,并弹出解引用地址的约束,继续搜索空指针解引用地址,直到该符号表达式图遍历完成。
14.根据权利要求1所述的过程间的空指针解引用检测方法,其特征在于,所述控制依赖性边指向的一侧为逻辑运算的运算符或布尔值节点。
15.根据权利要求1所述的过程间的空指针解引用检测方法,其特征在于,用真和假来标记所述控制依赖性边,以表明逻辑运算的所需的结果。
16.根据权利要求1所述的过程间的空指针解引用检测方法,其特征在于,待检测程序是程序片段,并且所述符号表达式图是从底层向上构建的。
17.根据权利要求1所述的过程间的空指针解引用检测方法,其特征在于,所述预处理包括展开程序中的循环。
18.一种过程间的空指针解引用检测系统,其特征在于,包括:
预处理模块,对待检测程序进行预处理;
表达式生成模块,生成所述待检测程序中的主调函数的符号表达式图和被调函数的符号表达式图,所述符号表达式图包括值节点、运算符节点,以及连接节点的数据依赖性边和控制依赖性边,其中,值节点包括终端值节点和非终端值节点,终端值节点表示当前函数外生成的未知的值或常量,所述终端值节点包括当前函数可访问的参数、全局变量和堆位置的值,非终端值节点表示当前函数内生成的值,并且每个非终端值与一个唯一的内存地址相关联,所述数据依赖性边是将节点连接到与其有直接数据依赖关系的值节点的有向边,所述控制依赖性边是当存在限定变量的条件时将变量连接到条件的所述有向边,所述控制依赖性边对应的箭头侧的节点是运算符节点;
摘要生成模块,根据所述被调函数的符号表达式图对所述被调函数进行过程内分析,以检测所述被调函数中的空指针以及生成所述被调函数的函数摘要;
嵌入模块,将所述被调函数的所述函数摘要嵌入所述主调函数;
分析模块,根据所述主调函数的符号表达式图对所述主调函数进行过程内分析,以检测所述主调函数中的空指针解引用。
19.一种过程间的空指针解引用检测设备,其特征在于,包括:
包括:
处理器;
存储器,其中存储有所述处理器的可执行指令;
其中,所述处理器配置为经由执行所述可执行指令来执行权利要求1~17任意一项所述的过程间的空指针解引用检测方法的步骤。
20.一种计算机可读存储介质,用于存储程序,其特征在于,所述程序被执行时实现权利要求1~17任意一项所述的过程间的空指针解引用检测方法的步骤。
CN201811014686.4A 2017-09-01 2018-08-31 过程间的空指针解引用检测方法、系统、设备以及介质 Active CN109426615B (zh)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
CN201710781158 2017-09-01
CN2017107811580 2017-09-01

Publications (2)

Publication Number Publication Date
CN109426615A CN109426615A (zh) 2019-03-05
CN109426615B true CN109426615B (zh) 2022-01-28

Family

ID=65514779

Family Applications (4)

Application Number Title Priority Date Filing Date
CN201811013000.XA Active CN109426723B (zh) 2017-09-01 2018-08-31 使用释放后内存的检测方法、系统、设备及存储介质
CN201811014686.4A Active CN109426615B (zh) 2017-09-01 2018-08-31 过程间的空指针解引用检测方法、系统、设备以及介质
CN201811013103.6A Pending CN109426614A (zh) 2017-09-01 2018-08-31 缺陷检测方法、设备、系统和计算机可读存储介质
CN201811015751.5A Active CN109426722B (zh) 2017-09-01 2018-08-31 Sql注入缺陷检测方法、系统、设备及存储介质

Family Applications Before (1)

Application Number Title Priority Date Filing Date
CN201811013000.XA Active CN109426723B (zh) 2017-09-01 2018-08-31 使用释放后内存的检测方法、系统、设备及存储介质

Family Applications After (2)

Application Number Title Priority Date Filing Date
CN201811013103.6A Pending CN109426614A (zh) 2017-09-01 2018-08-31 缺陷检测方法、设备、系统和计算机可读存储介质
CN201811015751.5A Active CN109426722B (zh) 2017-09-01 2018-08-31 Sql注入缺陷检测方法、系统、设备及存储介质

Country Status (2)

Country Link
US (1) US10642584B2 (zh)
CN (4) CN109426723B (zh)

Families Citing this family (24)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN109918903B (zh) * 2019-03-06 2022-06-21 西安电子科技大学 一种基于llvm编译器的程序非控制数据攻击防护方法
CN110119275B (zh) * 2019-05-13 2021-04-02 电子科技大学 一种分布式内存列式数据库编译执行器架构
CN110175123A (zh) * 2019-05-22 2019-08-27 中国石油大学(华东) 一种基于符号表达式静态缺陷警报关联识别方法
CN110286891B (zh) * 2019-06-25 2020-09-29 中国科学院软件研究所 一种基于代码属性张量的程序源代码编码方法
CN110545264B (zh) * 2019-08-16 2021-09-03 苏州浪潮智能科技有限公司 一种自动化检测ldap认证注入漏洞的方法及装置
CN110442527B (zh) * 2019-08-16 2023-07-18 扬州大学 面向bug报告的自动化修复方法
CN110851139B (zh) * 2019-11-07 2023-04-18 北京字节跳动网络技术有限公司 用于检查代码的方法、装置和电子设备
CN110929264B (zh) * 2019-11-21 2022-08-30 中国工商银行股份有限公司 漏洞检测方法、装置、电子设备及可读存储介质
CN111104335B (zh) * 2019-12-25 2021-08-24 清华大学 一种基于多层次分析的c语言缺陷检测方法及装置
CN111382427B (zh) * 2020-01-06 2022-04-26 宁波中科天齐信息技术有限公司 基于变量关联规则的缓冲区溢出检测方法
CN111460450B (zh) * 2020-03-11 2023-02-10 西北大学 一种基于图卷积网络的源代码漏洞检测方法
CN111737289B (zh) * 2020-06-05 2023-07-25 北京奇艺世纪科技有限公司 Sql注入攻击的检测方法、装置
CN112015397B (zh) * 2020-09-07 2023-09-26 深圳职业技术学院 环路检测方法及系统
CN112084115A (zh) * 2020-09-16 2020-12-15 京东数字科技控股股份有限公司 软件缺陷的流程化操作方法和装置
CN112287353A (zh) * 2020-10-28 2021-01-29 北京智游网安科技有限公司 一种漏洞检测方法、终端及存储介质
CN112685779A (zh) * 2020-12-31 2021-04-20 天津南大通用数据技术股份有限公司 基于数据库执行select语句主要关键字的静态可信判定方法
CN113010890B (zh) * 2021-02-26 2023-02-07 中科天齐(山西)软件安全技术研究院有限公司 一种应用程序安全检测方法、装置、电子设备和存储介质
CN113010891B (zh) * 2021-02-26 2023-02-07 中科天齐(山西)软件安全技术研究院有限公司 一种应用程序安全检测方法、装置、电子设备和存储介质
CN112632550B (zh) * 2021-03-05 2021-06-29 北京邮电大学 口令和密钥的应用安全的检测方法及其电子设备
CN113076090B (zh) * 2021-04-23 2022-07-05 中国人民解放军国防科技大学 一种面向边信道安全防护的循环语句执行方法及装置
US20230075295A1 (en) * 2021-09-03 2023-03-09 Fujitsu Limited Automatic denoising of machine learning projects
CN113741969B (zh) * 2021-11-01 2022-03-11 北京鸿渐科技有限公司 分析源库模式缺陷检测器的深层结构体指针分析优化方法
CN114282226B (zh) * 2021-12-31 2024-05-28 上海交通大学 单次多漏洞代码检测方法及系统
CN114510722B (zh) * 2022-02-17 2023-01-06 北京大学 增量代码的静态检测方法及检测系统

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103218296A (zh) * 2013-04-22 2013-07-24 北京邮电大学 一种充分检测空指针引用缺陷的方法
CN103914382A (zh) * 2014-03-25 2014-07-09 北京邮电大学 一种充分识别指针引用检测对象的方法
CN107193742A (zh) * 2017-05-23 2017-09-22 电子科技大学 一种基于状态的路径敏感的符号化函数摘要算法

Family Cites Families (26)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5075883A (en) * 1991-01-03 1991-12-24 The United States Of America As Represented By The Secretary Of The Army Analog and analytical computation method for determining detector MTF
JP2000076490A (ja) * 1998-09-02 2000-03-14 Casio Comput Co Ltd 表示制御装置及び記憶媒体
US7484205B2 (en) * 2002-12-12 2009-01-27 Microsoft Corporation Preprocessor-based source code instrumentation
US8170466B2 (en) * 2005-05-27 2012-05-01 Ctb/Mcgraw-Hill System and method for automated assessment of constrained constructed responses
US7962901B2 (en) * 2006-04-17 2011-06-14 Microsoft Corporation Using dynamic analysis to improve model checking
CN100461132C (zh) * 2007-03-02 2009-02-11 北京邮电大学 基于源代码静态分析的软件安全代码分析器及其检测方法
CN101271421A (zh) * 2007-03-22 2008-09-24 北京邮电大学 一种软件故障测试系统及方法
US8245209B2 (en) * 2007-05-29 2012-08-14 International Business Machines Corporation Detecting dangling pointers and memory leaks within software
JP2010146615A (ja) * 2008-12-16 2010-07-01 Hitachi Global Storage Technologies Netherlands Bv データを記憶するディスクのゾーン・フォーマット設定方法及びディスク・ドライブ
US20100223599A1 (en) * 2009-02-27 2010-09-02 Fujitsu Limited Efficient symbolic execution of software using static analysis
CN101894064B (zh) * 2009-05-21 2013-01-02 北京邮电大学 应用跨函数分析的软件测试方法
JP5529970B2 (ja) * 2009-09-29 2014-06-25 テルコーディア テクノロジーズ インコーポレイテッド リソースが有限であるストリーム計算アプリケーション向けの、関連のある因果的なコンテキスト履歴の捕捉、送信、および再構築の可能化
US9251491B2 (en) * 2009-11-30 2016-02-02 International Business Machines Corporation Performance-aware enterprise components
CN102073587B (zh) * 2010-12-27 2013-07-03 北京邮电大学 一种程序中不可达路径的静态检测方法
CN102222035A (zh) * 2011-07-25 2011-10-19 公安部第三研究所 基于符号执行技术的软件行为检测系统及检测方法
CN103019862B (zh) * 2012-12-13 2015-08-19 北京神州绿盟信息安全科技股份有限公司 一种符号执行方法、装置及系统
US9274925B2 (en) * 2013-04-30 2016-03-01 Fujitsu Limited Programmable symbolic execution based dynamic checker
CN104679646B (zh) * 2013-11-29 2018-02-06 阿里巴巴集团控股有限公司 一种用于检测sql代码缺陷的方法和装置
CN104750563B (zh) * 2013-12-26 2017-11-07 北京大学 一种基于控制流图的内存泄漏自动修复方法
CN103914381B (zh) * 2014-03-25 2017-06-13 北京邮电大学 生成时序安全属性类缺陷模式相关的函数摘要信息的方法
US10303808B2 (en) * 2014-05-16 2019-05-28 Configit A/S Product configuration
CN105607990B (zh) * 2014-11-19 2019-07-05 腾讯科技(成都)有限公司 一种空指针崩溃的挖掘方法及装置
CN104536883B (zh) * 2014-12-05 2017-06-16 北京邮电大学 一种静态缺陷检测方法及其系统
CN104573503B (zh) * 2015-02-11 2018-04-27 中国农业银行股份有限公司 一种内存访问溢出的检测方法及装置
CN105740149B (zh) * 2016-01-29 2018-02-16 中国人民解放军信息工程大学 基于脆弱性模型和符号执行结合的软件安全检测方法
CN106294156B (zh) * 2016-08-11 2018-12-07 北京邮电大学 一种静态代码缺陷检测分析方法及装置

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103218296A (zh) * 2013-04-22 2013-07-24 北京邮电大学 一种充分检测空指针引用缺陷的方法
CN103914382A (zh) * 2014-03-25 2014-07-09 北京邮电大学 一种充分识别指针引用检测对象的方法
CN107193742A (zh) * 2017-05-23 2017-09-22 电子科技大学 一种基于状态的路径敏感的符号化函数摘要算法

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
基于代码属性图的软件安全漏洞挖掘方法研究;杨克;《中国优秀硕士学位论文全文数据库信息科技辑》;20160215;I138-37 *

Also Published As

Publication number Publication date
CN109426722A (zh) 2019-03-05
CN109426615A (zh) 2019-03-05
CN109426722B (zh) 2021-06-29
US20190108003A1 (en) 2019-04-11
CN109426723B (zh) 2020-12-22
US10642584B2 (en) 2020-05-05
CN109426614A (zh) 2019-03-05
CN109426723A (zh) 2019-03-05

Similar Documents

Publication Publication Date Title
CN109426615B (zh) 过程间的空指针解引用检测方法、系统、设备以及介质
Allamanis et al. Self-supervised bug detection and repair
CN111125716B (zh) 一种以太坊智能合约漏洞检测方法及装置
US10606570B2 (en) Representing software with an abstract code graph
CN110287702B (zh) 一种二进制漏洞克隆检测方法及装置
US10354069B2 (en) Automated reverse engineering
US8589888B2 (en) Demand-driven analysis of pointers for software program analysis and debugging
CN111104335B (zh) 一种基于多层次分析的c语言缺陷检测方法及装置
CN104636256A (zh) 一种内存访问异常的检测方法及装置
JP2007528059A (ja) ソフトウェアのモデル化、抽象、および分析のためのシステムと方法
GB2454263A (en) Generating debug information from low level program code
JP2007052625A (ja) ソースコード脆弱性検査装置
US8984495B2 (en) Enhanced string analysis that improves accuracy of static analysis
Vishnyakov et al. Sydr: Cutting edge dynamic symbolic execution
Mueller-Gritschneder et al. Control-flow-driven source level timing annotation for embedded software models on transaction level
Abdurazik et al. Using coupling-based weights for the class integration and test order problem
Gerasimov Directed dynamic symbolic execution for static analysis warnings confirmation
Suzanne et al. Relational thread-modular abstract interpretation under relaxed memory models
Gerasimov et al. An approach to reachability determination for static analysis defects with the help of dynamic symbolic execution
CN111966578A (zh) 一种安卓兼容性缺陷修复效果的自动化评估方法
Gotlieb et al. Goal-oriented test data generation for pointer programs
CN109710538B (zh) 一种用于大规模系统中状态相关缺陷的静态检测方法
US8572594B2 (en) Invasion analysis to identify open types
Lindner et al. Proof-producing symbolic execution for binary code verification
Andreescu et al. Correlating structured inputs and outputs in functional specifications

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
CB03 Change of inventor or designer information

Inventor after: Xiao Xiao

Inventor after: Shi Qingkai

Inventor after: Zhou Jinguo

Inventor after: Fan Gang

Inventor before: Xiao Xiao

Inventor before: Shi Qingkai

Inventor before: Zhou Jinguo

Inventor before: Fan Gang

Inventor before: Zhang Chuan

CB03 Change of inventor or designer information
GR01 Patent grant
GR01 Patent grant