CN112988587A - 一种程序检测方法及装置 - Google Patents

一种程序检测方法及装置 Download PDF

Info

Publication number
CN112988587A
CN112988587A CN202110325581.6A CN202110325581A CN112988587A CN 112988587 A CN112988587 A CN 112988587A CN 202110325581 A CN202110325581 A CN 202110325581A CN 112988587 A CN112988587 A CN 112988587A
Authority
CN
China
Prior art keywords
execution
path
program
basic block
tested
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
Application number
CN202110325581.6A
Other languages
English (en)
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.)
Tsinghua University
Original Assignee
Tsinghua University
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 Tsinghua University filed Critical Tsinghua University
Priority to CN202110325581.6A priority Critical patent/CN112988587A/zh
Publication of CN112988587A publication Critical patent/CN112988587A/zh
Pending legal-status Critical Current

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/3668Software testing
    • G06F11/3672Test management
    • G06F11/3684Test management for test design, e.g. generating new test cases
    • 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
    • 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
    • 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

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Computer Hardware Design (AREA)
  • General Engineering & Computer Science (AREA)
  • Computer Security & Cryptography (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Software Systems (AREA)
  • Quality & Reliability (AREA)
  • Computing Systems (AREA)
  • Debugging And Monitoring (AREA)

Abstract

本发明公开了一种程序检测方法及装置,可以将种子文件输入待测试程序中进行混合符号执行,确定种子路径,在进行混合符号执行的过程中,确定基本块执行信息的时间序列数据并进行聚类,将目标子程序划分为至少一个阶段子程序,记录测试用例在至少一个阶段子程序中的种子状态值,按照符号执行策略将种子状态值输入至待测试程序中开展符号执行测试。本发明可以使得符号执行能在短时间内到达至种子状态值在某个阶段子程序中对应的输入相关语句处,并可以从该语句处继续开展符号执行测试,在有限时间内对其它分支路径进行更长时间的探索,在有限时间内对待测试程序中更多或者更深的路径进行探索,提高对待测试程序的代码覆盖率,提高程序检测效率。

Description

一种程序检测方法及装置
技术领域
本发明涉及软件领域,具体涉及一种程序检测方法及装置。
背景技术
随着科学技术的发展,程序检测技术不断提高。
当前,现有技术可以使用符号执行测试来进行程序检测。其中,符号执行测试可以通过执行程序代码,来检测程序存在的漏洞。符号执行测试可以具体包括静态符号执行测试和动态符号执行测试。
但是,当待测试程序中存在有较多的条件判断、循环或者递归等指令时,符号执行测试在对待测试程序进行程序检测的过程中不免会产生路径爆炸。而在产生路径爆炸的情况下,现有的符号执行测试对待测试程序的代码覆盖率可能较低,导致程序检测效率较低。
发明内容
鉴于上述问题,本发明提供一种克服上述问题或者至少部分地解决上述问题的程序检测方法及装置,技术方案如下:
一种程序检测方法,包括:
将种子文件输入待测试程序中进行混合符号执行,以确定所述待测试程序中的种子路径,所述种子文件中包括测试用例;
在将所述种子文件输入所述待测试程序中进行混合符号执行的过程中,确定基本块执行信息的时间序列数据;
对所述时间序列数据进行聚类,以将目标子程序划分为至少一个阶段子程序,所述目标子程序由所述待测试程序在所述种子路径上的基本块构成;
记录所述测试用例在至少一个所述阶段子程序中的种子状态值;
按照符号执行策略,将至少一个所述种子状态值输入至所述待测试程序中开展符号执行测试。
可选的,所述确定基本块执行信息的时间序列数据,包括:
分别确定时长相等且连续的多个时段对应的基本块向量,其中,所述基本块向量包括各路径基本块在相应时段内的执行标记数据,以及在相应时段结束时的代码覆盖率,所述路径基本块为所述待测试程序在所述种子路径上的基本块,所述执行标记数据用于标记所述路径基本块在相应时段内是否被执行;
将确定的各所述基本块向量确定为所述时间序列数据。
可选的,所述分别确定时长相等且连续的多个时段对应的基本块向量,包括:
分别在时长相等且连续的多个时段内,记录各所述路径基本块的执行标记数据;
分别对各所述时段内的所述执行标记数据进行归一化处理,获得各所述时段的归一化处理后数据;
分别计算在各所述时段结束时的代码覆盖率;
分别将各所述时段的所述归一化处理后数据和相应的代码覆盖率确定为一个基本块向量。
可选的,所述对所述时间序列数据进行聚类,以将目标子程序划分为至少一个阶段子程序,包括:
对各所述基本块向量进行聚类;
在同一簇内的各基本块向量的执行标记数据中,确定第一标记数据,所述第一标记数据为用于标记路径基本块被执行的执行标记数据;
将同一簇内的各所述第一标记数据对应的路径基本块确定为一个所述阶段子程序。
可选的,所述记录所述测试用例在至少一个所述阶段子程序中的种子状态值,包括:
在至少一个所述阶段子程序中,确定路径分支语句;
分别记录首次执行各所述路径分支语句完毕时形成的目标符号化路径约束表达式;
分别将各所述目标符号化路径约束表达式,确定为所述测试用例在相应的所述阶段子程序中的种子状态值。
可选的,所述按照符号执行策略,将至少一个所述种子状态值输入至所述待测试程序中开展符号执行测试,包括:
按照各所述阶段子程序在所述待测试程序中的位置顺序,依次将相应的所述种子状态值输入至所述待测试程序中开展符号执行测试。
一种程序检测装置,包括:第一确定单元、第二确定单元、划分单元、第一记录单元和测试单元,其中:
所述第一确定单元,被配置为执行:将种子文件输入待测试程序中进行混合符号执行,以确定所述待测试程序中的种子路径,所述种子文件中包括测试用例;
所述第二确定单元,被配置为执行:在将所述种子文件输入所述待测试程序中进行混合符号执行的过程中,确定基本块执行信息的时间序列数据;
所述划分单元,被配置为执行:对所述时间序列数据进行聚类,以将目标子程序划分为至少一个阶段子程序,所述目标子程序由所述待测试程序在所述种子路径上的基本块构成;
所述第一记录单元,被配置为执行:记录所述测试用例在至少一个所述阶段子程序中的种子状态值;
所述测试单元,被配置为执行:按照符号执行策略,将至少一个所述种子状态值输入至所述待测试程序中开展符号执行测试。
可选的,所述第二确定单元,包括:第三确定单元和第四确定单元,其中:
所述第三确定单元,被配置为执行:在将所述种子文件输入所述待测试程序中进行混合符号执行的过程中,分别确定时长相等且连续的多个时段对应的基本块向量,其中,所述基本块向量包括各路径基本块在相应时段内的执行标记数据,以及在相应时段结束时的代码覆盖率,所述路径基本块为所述待测试程序在所述种子路径上的基本块,所述执行标记数据用于标记所述路径基本块在相应时段内是否被执行;
所述第四确定单元,被配置为执行:将确定的各所述基本块向量确定为所述时间序列数据。
可选的,所述第三确定单元包括:第二记录单元、处理单元、获得单元、计算单元和第五确定单元,其中:
所述第二记录单元,被配置为执行:在将所述种子文件输入所述待测试程序中进行混合符号执行的过程中,分别在时长相等且连续的多个时段内,记录各所述路径基本块的执行标记数据;
所述处理单元,被配置为执行:分别对各所述时段内的所述执行标记数据进行归一化处理;
所述获得单元,被配置为执行:获得各所述时段的归一化处理后数据;
所述计算单元,被配置为执行:分别计算在各所述时段结束时的代码覆盖率;
所述第五确定单元,被配置为执行:分别将各所述时段的所述归一化处理后数据和相应的代码覆盖率确定为一个基本块向量。
可选的,所述划分单元,包括:聚类单元、第六确定单元和第七确定单元,其中:
所述聚类单元,被配置为执行:对各所述基本块向量进行聚类;
所述第六确定单元,被配置为执行:在同一簇内的各基本块向量的执行标记数据中,确定第一标记数据,所述第一标记数据为用于标记路径基本块被执行的执行标记数据;
所述第七确定单元,被配置为执行:将同一簇内的各所述第一标记数据对应的路径基本块确定为一个所述阶段子程序。
可选的,所述第一记录单元,包括:第八确定单元、第二记录单元和第九确定单元,其中:
所述第八确定单元,被配置为执行:在至少一个所述阶段子程序中,确定路径分支语句;
所述第二记录单元,被配置为执行:分别记录首次执行各所述路径分支语句完毕时形成的目标符号化路径约束表达式;
所述第九确定单元,被配置为执行:分别将各所述目标符号化路径约束表达式,确定为所述测试用例在相应的所述阶段子程序中的种子状态值。
可选的,所述测试单元,被配置为执行:按照各所述阶段子程序在所述待测试程序中的位置顺序,依次将相应的所述种子状态值输入至所述待测试程序中开展符号执行测试。
本实施例提出的程序检测方法及装置,可以将种子文件输入待测试程序中进行混合符号执行,以确定待测试程序中的种子路径,种子文件中包括测试用例,在将种子文件输入待测试程序中进行混合符号执行的过程中,确定基本块执行信息的时间序列数据,对时间序列数据进行聚类,以将目标子程序划分为至少一个阶段子程序,目标子程序由待测试程序在种子路径上的基本块构成,记录测试用例在至少一个阶段子程序中的种子状态值,按照符号执行策略,将至少一个种子状态值输入至待测试程序中开展符号执行测试。
本发明可以通过将种子状态值作为测试用例的初始状态值输入待测试程序中,来针对相应的阶段子程序开展符号执行测试时,可以使得符号执行无需进行复杂的路径探索,即可以在短时间内到达至种子状态值在某个阶段子程序中对应的输入相关的语句处,并可以从该语句处继续开展符号执行测试,避免因执行循环或递归指令等情况而陷在某一个阶段子程序中,使得符号执行可以在有限时间内对不属于种子路径的其它分支路径进行更长时间的探索,执行其它分支路径在待测试程序中对应的代码,在有限时间内对待测试程序中更多或者更深的路径进行探索,提高对待测试程序的代码覆盖率,提高程序检测效率和检测质量。
上述说明仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段,而可依照说明书的内容予以实施,并且为了让本发明的上述和其它目的、特征和优点能够更明显易懂,以下特举本发明的具体实施方式。
附图说明
通过阅读下文优选实施方式的详细描述,各种其他的优点和益处对于本领域普通技术人员将变得清楚明了。附图仅用于示出优选实施方式的目的,而并不认为是对本发明的限制。而且在整个附图中,用相同的参考符号表示相同的部件。在附图中:
图1示出了本发明实施例提出的一种程序检测方法的流程图;
图2示出了本发明实施例提出的另一种程序检测方法的流程图;
图3示出了本发明实施例提出的另一种程序检测方法的流程图;
图4示出了本发明实施例提出的一种目标子程序中各路径基本块的执行流程示意图;
图5示出了本发明实施例提出的一种对路径基本块的执行标记示意图;
图6示出了本发明实施例提出的一种竖向长条所对应向量的获得示意图;
图7示出了本发明实施例提出的一种各竖向长条所对应基本块向量的获得示意图;
图8示出了本发明实施例提出的一种对目标子程序进行阶段划分的示意图;
图9示出了本发明实施例提出的第一种程序检测装置的结构示意图。
具体实施方式
下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本公开,并且能够将本公开的范围完整的传达给本领域的技术人员。
如图1所示,本实施例提出一种程序检测方法,该方法可以包括以下步骤:
S101、将种子文件输入待测试程序中进行混合符号执行,以确定待测试程序中的种子路径,种子文件中包括测试用例;
其中,种子文件可以为用于输入待测试程序以启动对待测试程序进行混合符号执行的文件。种子文件中可以包括有用于对待测试程序进行混合符号执行的测试用例。测试用例中可以包括有具体值和符号值。
其中,混合符号执行可以包括具体执行和符号执行。具体的,本发明在使用测试用例对待测试程序进行混合符号执行的过程中,可以使用具体值对待测试程序进行具体执行,使用符号值对待测试程序进行符号执行。
其中,待测试程序可以为需要进行程序检测的计算机程序。待测试程序可以是一个具有完整结构的计算机程序,也可以是一个非完整结构的计算机程序。其中,非完整结构的计算机程序可以由完整结构的计算机程序中的部分代码构成。
具体的,待测试程序中可以包括有一条路径或多条路径上的子程序,每条路径上的子程序,均可以由待测试程序在相应路径上的基本块构成。比如,待测试程序中可以包括有第一条路径上的子程序和第二条路径上的子程序,第一条路径上的子程序可以由待测试程序在第一条路径上的基本块构成,第二条路径上的子程序可以由待测试程序在第二条路径上的基本块构成。
其中,种子路径可以为待测试程序中的某条路径。种子路径可以与种子文件中的测试用例相对应,本发明可以使用测试用例对待测试程序在种子路径上的目标子程序进行混合符号执行。具体的,本发明可以在使用测试用例对待测试程序进行混合符号执行的过程中,识别并记录发生执行的基本块,根据发生执行的基本块来确定测试用例对应的种子路径。
可选的,本发明可以在执行图1所示方法之前,在低级虚拟机(Low Level VirtualMachine,LLVM)中,使用现有的符号执行引擎对待测试程序进行基本块的分析及标识,划分并识别出待测试程序中的各基本块。本发明也可以使用符号执行引擎对种子文件和待测试程序进行混合符号执行,并可以在混合符号执行过程中,识别并记录待测试程序中发生执行的基本块,确定种子文件对应的种子路径(即种子文件中的测试用例对应的种子路径)。
需要说明的是,本发明在对程序进行符号执行时,可以对程序在某条路径上的子程序进行符号执行,探索程序中的该条路径。其中,本发明在对子程序进行符号执行的过程中,可以全局维护两个参数,一个参数可以为符号状态,另一个参数可以为符号化路径约束表达式。具体的,本发明在对子程序进行符号执行,即对程序中相应的路径进行探索的过程中,可以在该条路径上的各路径分支点处(即子程序上的分支语句)收集分支条件,不断更新符号化路径约束表达式。在符号执行结束时,本发明可以通过使用约束求解器对最终获得的符号化路径约束表达式进行求解,来生成与已探索的那条路径对应的第一具体值。可以理解的是,如果将生成的第一具体值输入至程序中进行具体执行,则可以对符号执行过程中已探索的那条路径上的子程序进行具体执行。
可选的,本发明在选取测试用例时,可以从针对待测试程序设置的输入用例中选取出测试用例;可选的,本发明也可以采用随机选取的方式来选取测试用例,此时具体值可以随机选取,而符号值对应的符号状态可以是一个初始化为空的映射,符号化路径约束表达式可以初始化为true;可选的,本发明也可以针对已知的种子路径,来确定相应的测试用例即确定相应的具体值,确定符号值对应的符号状态和符号化路径约束表达式。需要说明的是,本发明对于测试用例的选取方式不做限定。
可以理解的是,当待测试程序中存在有较多的条件判断、循环或者递归等指令时,现有技术在执行待测试程序的过程中,很可能会出现重复执行相同或者相似的代码块的情况,即执行过程很可能会重复出现相同或者相似的执行行为。其中,对于导致产生相同或者相似执行行为的代码块,本发明可以将其确定为待测试程序中同一阶段的代码块。
其中,当待测试程序中存在有多个阶段的代码块,且其中的一个或多个阶段的代码块中存在有大量的路径时,现有技术如果试图对待测试程序中更深位置的子程序进行检测,即对更深位置的路径进行探索,则需要在有限的时间内搜索到从一个阶段进入至下一个阶段的路径,即确定出满足一定条件的输入数据。但是,从一个阶段进入至下一个阶段的路径很可能较少,现有技术在执行待测试程序时可能会陷在某一个阶段中,而难以在有限的时间内,搜索到进入至另一个阶段的路径,即难以在有限的时间内确定出满足一定要求或格式的输入数据,从而导致现有技术无法在有限的时间内探索至待测试程序更深位置的路径,无法执行更深位置的子程序,导致代码覆盖率较低,程序检测效率较低,程序检测质量低。
具体的,本发明可以通过对待测试程序在种子路径上的目标子程序进行一次混合符号执行,在混合符号执行过程中,分别记录混合符号执行在不同时段内对种子路径上的基本块进行执行的相关信息,即基本块执行信息,并可以根据记录的多个时段内的基本块执行信息对目标子程序进行阶段划分,之后再分别针对目标子程序的各个阶段来开展符号执行测试,以实现对程序的阶段跨越,探索待测试程序中更深位置的路径,提高对待测试程序的代码覆盖率,提高程序检测效率和检测质量。
具体的,本发明在对待测试程序进行混合符号执行的过程中,对于待测试程序在种子路径上的每条语句或者指令,本发明均可以先行对其进行具体执行,之后紧接着再对其进行符号执行。比如,本发明在对种子路径上的第N条语句(N为正整数)进行混合符号执行时,可以先行使用执行完第(N-1)条语句时的具体值,对第N条语句进行具体执行,之后再紧接着使用执行完第(N-1)条语句时的符号值,对第N条语句进行符号执行。
S102、在将种子文件输入待测试程序中进行混合符号执行的过程中,确定基本块执行信息的时间序列数据;
其中,时间序列数据可以由按发生时间的先后顺序所排列的多个元素数据构成,每个元素数据均可以包括有混合符号执行在时长为预设定值的相应时段内的基本块执行信息。比如,第一元素数据可以包括有混合符号执行在时长为0.2秒的第一时段内的基本块执行信息,第二元素数据可以包括有混合符号执行在时长为0.2秒、与第一时段相邻的第二时段内的基本块执行信息。
其中,本发明可以在对待测试程序进行混合符号执行的过程中,记录混合符号执行在各时段内的基本块执行信息。
其中,基本块执行信息可以体现混合符号执行在相应时段内对种子路径上各路径基本块(路径基本块即为待测试程序在种子路径上的基本块)的执行行为,比如,基本块执行信息可以包括有各路径基本块在相应时段内是否被执行、各路径基本块有无条件判断语句、各路径基本块有无递归语句以及相应时段结束时的代码覆盖率等信息中的至少一种。可选的,基本块执行信息可以包括:混合符号执行在相应时段结束时的代码覆盖率,以及用于标记各路径基本块在相应时段内执行情况的执行标记数据(如标记路径基本块被执行或未被执行)。
可选的,执行标记数据可以包括1和0,1可以用于标记某个路径基本块被执行,0可以用于标记某个路径基本块未被执行。需要说明的是,本发明对于执行标记数据的具体数值或者具体类型均不做限定。
其中,代码覆盖率可以为混合符号执行在种子路径上已执行过的路径基本块的数量,与种子路径上路径基本块的总数量的比值。
需要说明的是,元素数据中的组成信息可以按照相应顺序排列在元素数据中,可以为更好的对基本块执行信息的组成信息及排列进行说明,本发明提出并结合例1对其进行说明。
例1:当种子路径上包括有第一路径基本块、第二路径基本块和第三路径基本块,而基本块执行信息包括各路径基本块的执行标记数据和代码覆盖率时,第一元素数据(即第一时段内的基本块执行信息)可以包括:{第一路径基本块在第一时段内的执行标记数据,第二路径基本块在第一时段内的执行标记数据,第三路径基本块在第一时段内的执行标记数据,第一时段结束时的代码覆盖率};第二元素数据(即第二时段内的基本块执行信息)可以包括:{第一路径基本块在第二时段内的执行标记数据,第二路径基本块在第二时段内的执行标记数据,第三路径基本块在第二时段内的执行标记数据,第二时段结束时的代码覆盖率}。
具体的,本发明可以在将测试用例输入至待测试程序进行混合符号执行时,即按照周期时长来统计混合符号执行在种子路径上的基本块执行信息,以获得时长相等且连续的各时段对应的元素数据,从而获得时间序列数据。比如,本发明可以在第一个周期时长内统计基本块执行信息,之后在第二个周期时长内统计基本块执行信息,将第一周期时长内的基本块执行信息确定为第一元素数据,将第二周期时长内的基本块执行信息确定为第二元素数据。
其中,周期时长可以由技术人员根据实际情况进行制定,本发明对此不做限定。比如,本发明可以采用执行1000条指令所需的时间确定为周期时长。
S103、对时间序列数据进行聚类,以将目标子程序划分为至少一个阶段子程序,目标子程序由待测试程序在种子路径上的基本块构成;
其中,目标子程序可以为待测试程序在种子路径上的子程序。
其中,阶段子程序可以为目标子程序中某一个阶段的代码块,即具有相同或者相似执行行为的代码块。可以理解的是,阶段子程序同样可以为目标子程序中的一个子程序。
具体的,本发明在获得时间序列数据后,可以通过对时间序列数据中的元素数据进行聚类,来将处于连续时段且基本块执行信息为相同或相似的元素数据划分为同一簇,即将连续时段内所表现的整体执行行为为相同或相似的元素数据划分为同一簇。
比如,对于分别与连续的第一时段、第二时段和第三时段对应的第一元素数据、第二元素数据和第三元素数据,如果第一元素数据与第二元素数据中的基本块执行信息为相同或相似,则本发明可以将第一元素数据与第二元素数据划分为同一簇;如果第一元素数据、第二元素数据和第三元素数据中的基本块执行信息为相同或相似,则本发明可以将第一元素数据、第二元素数据和第三元素数据划分为同一簇;其中,第一元素数据与第三元素数据对应的时段为非连续时段,此时即使第一元素数据与第三元素数据中的基本块执行信息为相同或相似,而第一元素数据与第二元素数据中的基本块执行信息未相似,或者第二元素数据与第三元素数据中的基本块执行信息未相似时,本发明也可以禁止将第一元素数据与第三元素数据划分为同一簇。
需要说明的是,如果某个元素数据与相邻的元素数据均不相似,则本发明可以将该元素数据单独划分为一簇。比如,对于分别与连续的第一时段、第二时段和第三时段对应的第一元素数据、第二元素数据和第三元素数据,如果第二元素数据与第一元素数据的基本块执行信息不相似,且第二元素数据与第三元素数据的基本块执行信息不相似,则本发明可以将第二元素数据单独划分为一簇。
具体的,本发明可以使用聚类算法进行上述聚类过程,比如K-means算法。
具体的,本发明可以在同一簇的元素数据内,将发生执行的路径基本块划分为同一阶段的代码块即同一阶段子程序。比如,对于同一簇内的第一元素数据和第二元素数据,如果第一元素数据中的第一路径基本块发生执行,第二元素数据中的第二路径基本块发生执行,则本发明可以将第一路径基本块和第二路径基本块划分为同一阶段的代码块。
S104、记录测试用例在至少一个阶段子程序中的种子状态值;
其中,种子状态值可以包括为测试用例在阶段子程序中经过输入相关的语句时形成的符号化路径约束表达式。
其中,输入相关的语句可以是包括有条件判断、错误检查或循环指令等可以在程序中产生路径分支的语句,即路径分支语句。
具体的,本发明可以在使用测试用例对目标子程序进行混合符号执行的过程中,记录测试用例在经过输入相关的语句时形成的符号化路径约束表达式。
可以理解的是,当一个阶段子程序中存在输入相关的语句时,符号执行可以从该输入相关的语句处进入至不属于种子路径的其它分支路径。因此,本发明可以对测试用例的种子状态值进行记录,后续可以使用种子状态值作为测试用例的初始状态值输入至待测试程序中开展符号执行测试,可以使得符号执行在短时间内到达相应的输入相关的语句处,可以在实现阶段穿越的情况下,对非种子路径的其它分支路径进行探索,提高代码覆盖率。
其中,对于存在输入相关语句的阶段子程序,条件判断和循环等指令的存在可能会使得阶段子程序中的代码块多次执行,其输入相关的语句也可能会多次执行,因此在阶段子程序的执行过程中记录的符号化约束表达式可能会有多个。具体的,本发明可以将首次执行完阶段子程序的输入相关语句时形成的符号化约束表达式,确定为测试用例的种子状态值以进行后续的符号执行测试,使得后续的符号执行测试在首次到达阶段子程序中输入相关语句处时,即可以开展对其它分支路径的探索,有利于减少对计算机资源的消耗。
可选的,步骤S104可以具体包括:
在至少一个阶段子程序中,确定路径分支语句;
分别记录首次执行各路径分支语句完毕时形成的目标符号化路径约束表达式;
分别将各目标符号化路径约束表达式,确定为测试用例在相应的阶段子程序中的种子状态值。
其中,路径分支语句可以为上述输入相关语句。
具体的,本发明可以在确定阶段子程序中的路径分支语句后,记录符号执行在首次执行完路径分支语句时形成的目标符号化路径约束表达式。比如,本发明可以在确定第一阶段子程序中的路径分支语句后,记录符号执行在首次执行完第一阶段子程序中的路径分支语句时形成的目标符号化路径约束表达式;在确定第二阶段子程序中的路径分支语句后,记录符号执行在首次执行完第二阶段子程序中的路径分支语句时形成的目标符号化路径约束表达式。
具体的,本发明可以将记录的目标符号化路径约束表达式,确定为测试用例在相应的阶段子程序中的种子状态值。比如,本发明可以将在第一阶段子程序中记录的目标符号化路径约束表达式,确定为测试用例在第一阶段子程序中的种子状态值,可以将在第二阶段子程序中记录的目标符号化路径约束表达式,确定为测试用例在第二阶段子程序中的种子状态值。
具体的,本发明可以在进行混合符号执行的过程中,对应记录待测试程序中各输入相关语句的执行时间,以及执行完输入相关语句时所形成的符号化路径约束表达式,之后,本发明可以在划分好阶段子程序之后,确定各输入相关语句所属的阶段子程序,确定阶段子程序中执行时间最早的输入相关语句所对应的符号化路径约束表达式,将其确定为目标符号化路径约束表达式,即确定为测试用例在阶段子程序中的种子状态值。
可以理解的是,本发明可以将种子状态值作为测试用例的初始状态值输入至待测试程序中开展符号执行测试,此时符号执行无需进行复杂的路径探索,即可以在短时间内到达相应的输入相关语句处,对非种子路径的其它分支路径进行探索,在实现阶段穿越的情况下进行符号执行测试,可以有效提高代码覆盖率。
S105、按照符号执行策略,将至少一个种子状态值输入至待测试程序中开展符号执行测试。
其中,符号执行策略可以包括针对不同阶段子程序开展符号执行测试的执行顺序。
具体的,本发明可以按照符号执行策略所包括的各阶段子程序的执行顺序,依次针对相应的阶段子程序开展符号执行测试。比如,对于第一阶段子程序、第二阶段子程序和第三阶段子程序,如果在符号执行策略中,第一阶段子程序的执行次序为1,第二阶段子程序的执行次序为2,第三阶段子程序的执行次序为3,则本发明在按照符号执行策略开展对待测试程序的符号执行测试时,可以先行针对第一阶段子程序开展符号执行测试,之后针对第二阶段子程序开展符号执行测试,最后针对第三阶段子程序开展符号执行测试。
可以理解的是,本发明可以仅利用一个阶段子程序对应的种子状态值,对一个阶段子程序开展符号执行测试,也可以分别利用不同阶段子程序对应的种子状态值,针对各阶段子程序开展符号执行测试。
具体的,本发明可以按照符号执行策略,依次将各阶段子程序对应的种子状态值输入至待测试程序中开展符号执行测试(即将各阶段子程序对应的种子状态值依次作为测试用例的初始状态值,输入至待测试程序中开展符号执行测试)。比如,待测试程序中的第一阶段子程序和第二阶段子程序的执行次序分别为1和2时,本发明可以先行将第一阶段子程序对应的种子状态值输入至待测试程序中开展符号执行测试,之后再将第二阶段子程序对应的种子状态值输入至待测试程序中开展符号执行测试。
可选的,符号执行测试可以包括静态符号执行测试和动态符号执行测试。
可选的,种子状态值可以仅包括符号化路径约束表达式,此时本发明可以将种子状态值作为测试用例的初始状态值输入至待测试程序中,对待测试程序进行静态符号执行测试。
可选的,种子状态值还可以包括与符号化路径约束表达式对应的目标具体值。可以理解的是,目标具体值可以为对待测试程序进行混合符号执行时所使用的具体值;当然,本发明也可以通过约束求解器对种子状态值中的符号化路径约束表达式进行求解,来获得符号化路径约束表达式对应的具体值。
需要说明的是,当种子状态值包括符号化路径约束表达式和具体值时,本发明可以将种子状态值作为测试用例的初始状态值输入至待测试程序中,对待测试程序进行动态符号执行测试。
其中,多数情况下,在待测试程序中处于前列位置的阶段子程序的路径约束条件比处于后列位置的阶段子程序的简单,因此,本发明在制定符号执行策略时,可以考虑阶段子程序在种子路径中的位置顺序。
可选的,步骤S105可以具体为:
按照各阶段子程序在待测试程序中的位置顺序,依次将相应的种子状态值输入至待测试程序中开展符号执行测试。
具体的,本发明可以先行针对在待测试程序中处于前列位置的阶段子程序开展符号执行测试,之后再针对后列位置的阶段子程序开展符号执行测试,有利于提高符号执行测试的测试效率。
需要说明的是,本发明在针对某个阶段子程序开展符号执行测试时,无需在覆盖所有代码后才结束此次符号执行测试。本发明可以当代码覆盖率在一段时长内未发生增大时,结束此次符号执行测试,有利于避免测试资源的无谓消耗;当然,本发明也可以设置一个预设的测试时长,在符号执行测试的测试时长超出预设的测试时长时结束此次符号执行测试,有利于控制测试资源的消耗。
其中,预设的测试时长可以由技术人员根据实际情况进行制定,本发明对此不做限定。具体的,本发明可以通过增大预设的测试时长,来增大对阶段子程序开展的符号执行测试的测试时长,即增大路径探索的时长,尝试增大符号执行测试时的代码覆盖率,提高增大代码覆盖率的概率。
具体的,本发明可以对待测试程序在种子路径上的目标子程序开展的符号执行测试设置一个预设的整体测试时长,当对各阶段子程序进行的测试时长之和超过预设的整体测试时长时,本发明可以结束此次对目标子程序开展的符号执行测试,有利于控制整体测试资源的消耗。其中,如果对各阶段子程序进行的测试时长之和未超过预设的整体测试时长时,本发明可以继续在此前各阶段子程序的路径探索基础上再进行符号执行测试。
还需要说明的是,本发明通过将种子状态值作为测试用例的初始状态值输入待测试程序中,来针对相应的阶段子程序开展符号执行测试时,可以使得符号执行无需进行复杂的路径探索,避免因执行循环或递归指令等情况而陷在某一个阶段子程序中,可以在短时间内到达至种子状态值在某个阶段子程序中对应的输入相关的语句处,并可以从该语句处继续开展符号执行测试,此时本发明可以使得符号执行对不属于种子路径的其它分支路径进行探索,执行其它分支路径在待测试程序中对应的代码,在有限时间内对待测试程序中更多或者更深的路径进行探索,从而提高对待测试程序的代码覆盖率,提高程序检测效率和检测质量。
本实施例提出的程序检测方法,可以将种子文件输入待测试程序中进行混合符号执行,以确定待测试程序中的种子路径,种子文件中包括测试用例,在将种子文件输入待测试程序中进行混合符号执行的过程中,确定基本块执行信息的时间序列数据,对时间序列数据进行聚类,以将目标子程序划分为至少一个阶段子程序,目标子程序由待测试程序在种子路径上的基本块构成,记录测试用例在至少一个阶段子程序中的种子状态值,按照符号执行策略,将至少一个种子状态值输入至待测试程序中开展符号执行测试。本发明可以通过将种子状态值作为测试用例的初始状态值输入待测试程序中,来针对相应的阶段子程序开展符号执行测试时,可以使得符号执行无需进行复杂的路径探索,即可以在短时间内到达至种子状态值在某个阶段子程序中对应的输入相关的语句处,并可以从该语句处继续开展符号执行测试,避免因执行循环或递归指令等情况而陷在某一个阶段子程序中,使得符号执行可以在有限时间内对不属于种子路径的其它分支路径进行更长时间的探索,执行其它分支路径在待测试程序中对应的代码,在有限时间内对待测试程序中更多或者更深的路径进行探索,提高对待测试程序的代码覆盖率,提高程序检测效率和检测质量。
基于图1所示的步骤,本实施例提出另一种程序检测方法,如图2所示。在该方法中,步骤S102可以具体包括以下步骤:
S201、在将种子文件输入待测试程序中进行混合符号执行的过程中,分别确定时长相等且连续的多个时段对应的基本块向量,基本块向量包括各路径基本块在相应时段内的执行标记数据,以及在相应时段结束时的代码覆盖率,路径基本块为待测试程序在种子路径上的基本块,执行标记数据用于标记路径基本块是否在相应时段内是否被执行;
需要说明的是,在图2所示方法中,基本块执行信息可以包括各路径基本块在相应时段内的执行标记数据和混合符号执行在相应时段结束时的代码覆盖率。
其中,每个时段对应的基本块向量均可以包括种子路径上的各路径基本块在相应时段内的执行标记数据,以及混合符号执行在相应时段结束时的代码覆盖率。比如,如果待测试程序在种子路径上包括有第一路径基本块、第二路径基本块、第三路径基本块、第四和第五路径基本块共五个路径基本块,且该五个路径基本块在第一个时段内的执行标记数据分别为1、1、0、0和0(0可以标识路径基本块未被执行,1可以标识路径基本块被执行),则第一个时段对应的基本块向量可以表示为[2/5,1,1,0,0,0],其中,2/5即为第一时段结束时的代码覆盖率。
其中,本发明可以在使用测试用例对目标子程序进行混合符号执行的过程中,周期性的统计混合符号执行在相应时段内的基本块执行信息,即可以分别统计各路径基本块在相应时段内的执行标记数据,以及混合符号执行在相应时段结束时的代码覆盖率,以分别确定时长相等且连续的多个时段对应的基本块向量。比如,本发明可以统计第一时段内各路径基本块的执行标记数据,以及混合符号执行在第一时段结束时的代码覆盖率,将第一时段内的各路径基本块的执行标记数据和代码覆盖率确定为第一时段对应的基本块向量;之后统计与第一时段时长相等且连续的第二时段内各路径基本块的执行标记数据,以及混合符号执行在第二时段结束时的代码覆盖率,将第二时段内的各路径基本块的执行标记数据和代码覆盖率确定为第二时段对应的基本块向量。
S202、将确定的各基本块向量确定为时间序列数据。
需要说明的是,每个基本块向量均可以作为时间序列数据中的一个元素数据。本发明可以按照时间顺序,对基本块向量进行排列,以获得时间序列数据。
可以理解的是,在上述目标子程序中,一段包含有循环执行指令的代码块(即一段循环代码)很可能是同一阶段子程序中的代码。而执行目标子程序时,在连续时段内表现相同或者相似的执行行为的代码块很可能是一段循环代码。因此,本发明可以将连续时段内表现出相同或者相似执行行为的代码块确定为同一阶段子程序内的代码块。而在非连续时段内,即使出现相同或者相似的执行行为,本发明也可以认为其执行行为不属于同一阶段子程序内的执行行为,并可以认为非连续时段出现的相同或相似执行行为对应的代码为非同一段循环代码,即非同一阶段子程序中的代码。
需要说明的是,在目标子程序中执行同一阶段子程序内的一段循环代码时,其代码覆盖率在连续时段内的变化率可以是较小或者不变的。因此,本发明可以根据代码覆盖率在连续时段的大小变化情况,来进一步判断相同或者相似的执行行为是否在连续时段内发生,从而判断表现出相同或者相似的执行行为的代码是否为同一阶段子程序内的代码。
其中,如果本发明没有根据代码覆盖率进行一步判断相同或者相似的执行行为是否在连续时段内发生,则可能误将非连续时段内表现出相同或者相似执行行为的代码确定为同一阶段子程序中的代码,导致阶段子程序划分错误。
具体的,本发明可以将代码覆盖率加入至基本块向量中,使得后续在使用时间序列数据进行聚类,将目标子程序划分为阶段子程序时,可以将处于相邻时段且基本块执行信息相同或者相似的基本块向量划分为同一簇,提高对目标子程序进行阶段划分的准确性。
本实施例提出的程序检测方法,可以分别确定多个时段对应的基本块向量,并可以确定的基本块向量作为时间序列数据,提高对目标子程序进行阶段划分的准确性,以提高对待测试程序的检测效率。
基于图2所示的步骤,本实施例提出另一种程序检测方法,如图3所示,在该方法中,步骤S201可以具体包括以下步骤:
S301、在将种子文件输入待测试程序中进行混合符号执行的过程中,分别在时长相等且连续的多个时段内,记录各路径基本块的执行标记数据;
具体的,本发明可以分别在时长相等且连续的多个时段内,记录目标子程序上各路径基本块的执行标记数据。比如,在第一时段内,记录目标子程序上各路径基本块的执行标记数据,在与第一时段的时长相等且连续的第二时段内,记录目标子程序上各路径基本块的执行标记数据。
S302、分别对各时段内的执行标记数据进行归一化处理,获得相应的归一化处理后数据;
其中,本发明可以分别在各时段内,将各路径基本块的执行标记数据进行归一化处理。
具体的,本发明可以在进行归一化处理时,将各路径基本块的执行标记数据除以相应时段内执行标记数据的和值,而相除后的数据即为归一化处理后数据。比如,在第一个时段内,如果各路径基本块的执行标记数据分别为1、1、0、0和0,则第一个时段内执行标记数据的和值为2,本发明可以分别将各路径基本块的执行标记数据除以2,获得1/2、1/2、0、0和0,而1/2、1/2、0、0和0即为归一化处理后数据。
S303、分别计算在各时段结束时的代码覆盖率;
具体的,本发明可以分别在各时段结束时,获得各时段对应的代码覆盖率。比如,本发明可以在第一时段结束时,确定与第一时段对应的代码覆盖率;本发明可以在第二时段结束时,确定与第二时段对应的代码覆盖率。
S304、分别将各时段的归一化处理后数据和相应的代码覆盖率确定为一个基本块向量。
具体的,对于任一个时段内的归一化处理后数据和相应的代码覆盖率,本发明均可以将该时段内的归一化处理后数据中的各数据和相应的代码覆盖率均确定为一个基本块向量中的元素,以获得相应的一个基本块向量。比如,对于第一个时段,如果其归一化处理后数据为0、0、1/2、1/2和0,第一个时段结束时的代码覆盖率为2/5,则本发明可以将0、0、1/2、1/2、0和2/5均作为一个基本块向量中的元素,以获得相应的第一基本块向量[2/5,0,0,1/2,1/2,0]。
需要说明的是,本发明对于归一化处理后数据与代码覆盖率在基本块向量中所处的位置不做限定。比如,本发明可以将代码覆盖率设置在归一化处理后数据之前,如上述第一基本块向量;再比如,本发明也可以将代码覆盖率设置在归一化处理后数据之后。
为了更好的介绍基本块向量的获得过程,本发明提出并结合下述举例2来说明基本块向量的获得过程。
举例2:如图4所示,本实施例提出一种目标子程序中各路径基本块的执行流程示意图,其中,目标子程序可以包括路径基本块1、路径基本块2、路径基本块2……路径基本块10和路径基本块11共11个路径基本块,路径基本块3和8中存在有输入相关的语句。在执行目标子程序时,路径基本块3、4和5可以循环执行3次,路径基本块7、8、9和10可以循环执行2次。本发明在对目标子程序进行混合符号执行的过程中,可以使用图形记录的方式,分别在时长相等且连续的多个时段内,记录及统计基本块执行信息。其中,如果各时段的时长均为执行3个路径基本块所花费的时长,则可以获得如图5所示的对路径基本块的执行标记示意图。
在图5中,本发明使用竖向长条来体现各路径基本块在一个时段内的执行情况,并在竖向长条中使用小长方形来标记路径基本块是否在相应时段内被执行。具体的,在第一个时段内,路径基本块1、路径基本块2和路径基本块3均被执行1次,因此本发明可以在第一个竖向长条中,路径基本块1、路径基本块2和路径基本块3对应的位置处均标记有小长方形;具体的,在第二个时段内,路径基本块4、路径基本块5和路径基本块3均被执行1次,因此本发明可以在第二个竖向长条中,在路径基本块4、路径基本块5和路径基本块3对应的位置处标记有小长方形;依次类推,本发明可以在七个竖向长条中对各路径基本块的执行情况进行标记。
其中,本发明可以分别针对各竖向长条,获得相应的一个向量,各路径基本块的执行标记数据可以作为基本块向量中相应位置的元素。
如图6所示,以第六个竖向长条为例,本发明可以针对第六个竖向长条获得相应的一个向量,在该向量中,其第一个元素即为路径基本块1的执行标记数据,第二个元素即为路径基本块2的执行标记数据,……,第十一个元素即为路径基本块11的执行标记数据,而在第六个竖向长条中,路径基本块10、路径基本块7和路径基本块8三个路径基本块被执行,此时当执行标记数据为1或者0(0可以标识路径基本块未被执行,1可以标识路径基本块被执行)时,第六个竖向长条对应的向量即可以为[0,0,0,0,0,0,1,1,0,1,0]。
在获得各竖向长条对应的向量后,本发明可以分别对各向量中的元素即执行标记数据进行归一化处理,获得相应时段的归一化处理后数据。之后,本发明可以获得相应时段的代码覆盖率,根据相应时段的归一化处理后数据和代码覆盖率确定相应的基本块向量。以图6所示的第六个竖向长条对应的向量为例,本发明可以对该向量[0,0,0,0,0,0,1,1,0,1,0]中的元素进行归一化处理,获得第六个时段对应的归一化处理后数据,即[0,0,0,0,0,0,1/3,1/3,0,1/3,0],之后可以获得相应时段的代码覆盖率即第六个时段结束时的代码覆盖率10/11(第六个时段结束时,路径基本块1至10已被执行,路径基本块11未被执行),根据第六个时段对应的归一化处理后数据和相应时段的代码覆盖率确定第六个时段对应的基本块向量,即[0,0,0,0,0,0,1/3,1/3,0,1/3,0,10/11]。如图7所示,本发明可以获得对应各竖向长条的七个基本块向量。
本实施例提出的程序检测方法,可以分别记录和统计路径基本块在多个时段内的执行标记数据和相应的代码覆盖率,获得相应的基本块向量,提高对目标子程序进行阶段划分的准确性,从而提高对待测试程序的检测效率。
基于图3所示的步骤,本实施例提出另一种程序检测方法,在该方法中,步骤S103可以具体包括:
S401、对各基本块向量进行聚类;
具体的,本发明可以在获得分别与多个时段对应的多个基本块向量后,对各基本块向量进行聚类。
S402、在同一簇内的各基本块向量的执行标记数据中,确定第一标记数据,第一标记数据为用于标记路径基本块被执行的执行标记数据;
具体的,本发明可以在属于同一簇内的基本块向量中,识别出用于标记路径基本块被执行的第一标记数据。
S403、将同一簇内的各第一标记数据对应的路径基本块确定为一个阶段子程序。
具体的,本发明可以先行确定同一簇内的第一数据所对应的被执行的各个路径基本块,之后将确定的各路径基本块确定为同一阶段子程序中的路径基本块,即将同一簇的基本块向量所对应的时段内被执行的路径基本块确定为同一阶段子程序的路径基本块,以确定出至少一个阶段子程序。
需要说明的是,本发明可以针对属于一个簇内的各基本块向量,相应确定一个阶段子程序。如果聚类后可以获得多个簇,则本发明可以相应的将目标子程序划分为多个阶段子程序。
为了更好的说明阶段子程序的划分过程,本发明可以结合图7所示的在上述举例2中获得的各基本块向量进行说明。具体的,本发明可以对图7所示的各基本块向量进行聚类,之后,可以将各基本块向量聚类为三个簇,第一个簇可以包括第一个时段对应的基本块向量,第二个簇可以包括第二个时段、第三个时段和第四个时段分别对应的基本块向量,第三个簇可以包括第五个、第六个和第七个时段分别对应的基本块向量。具体的,本发明可以第一个簇的各基本块向量的执行标记数据中确定出第一标记数据,即确定出三个1/3,之后将该三个1/3分别对应的路径基本块即路径基本块1、路径基本块2和路径基本块3,确定为同一阶段子程序的路径基本块,从而可以确定出目标子程序中的一个阶段子程序A。依次类推,本发明可以根据第二个簇确定出目标子程序中的另一个阶段子程序B,根据第三个簇确定出目标子程序中的另一个阶段子程序C,即可以将目标子程序划分为三个阶段子程序。可以理解的是,混合符号执行可以在第一个时段内执行阶段子程序A上的代码,可以在第二个、第三个和第四个时段内执行阶段子程序B上的代码,可以在第五个、第六个和第七个时段内执行阶段子程序C上的代码,如图8所示。
本实施例提出的程序检测方法,可以将同一簇内发生执行的路径基本块确定为目标子程序中的同一阶段子程序,提高对目标子程序进行阶段划分的准确性,从而提高对待测试程序的检测效率。
与图1所示方法相对应,如图9所示,本实施例提出第一种程序检测装置,该装置可以包括:第一确定单元101、第二确定单元102、划分单元103、第一记录单元104和测试单元105,其中:
第一确定单元101,被配置为执行:将种子文件输入待测试程序中进行混合符号执行,以确定待测试程序中的种子路径,种子文件中包括测试用例;
其中,种子文件可以为用于输入待测试程序以启动对待测试程序进行混合符号执行的文件。种子文件中可以包括有用于对待测试程序进行混合符号执行的测试用例。测试用例中可以包括有具体值和符号值。
其中,混合符号执行可以包括具体执行和符号执行。具体的,本发明在使用测试用例对待测试程序进行混合符号执行的过程中,可以使用具体值对待测试程序进行具体执行,使用符号值对待测试程序进行符号执行。
其中,待测试程序可以为需要进行程序检测的计算机程序。待测试程序可以是一个具有完整结构的计算机程序,也可以是一个非完整结构的计算机程序。其中,非完整结构的计算机程序可以由完整结构的计算机程序中的部分代码构成。
具体的,待测试程序中可以包括有一条路径或多条路径上的子程序,每条路径上的子程序,均可以由待测试程序在相应路径上的基本块构成。
其中,种子路径可以为待测试程序中的某条路径。种子路径可以与种子文件中的测试用例相对应,本发明可以使用测试用例对待测试程序在种子路径上的目标子程序进行混合符号执行。具体的,本发明可以在使用测试用例对待测试程序进行混合符号执行的过程中,识别并记录发生执行的基本块,根据发生执行的基本块来确定测试用例对应的种子路径。
具体的,本发明可以通过对待测试程序在种子路径上的目标子程序进行一次混合符号执行,在混合符号执行过程中,分别记录混合符号执行在不同时段内对种子路径上的基本块进行执行的相关信息,即基本块执行信息,并可以根据记录的多个时段内的基本块执行信息对目标子程序进行阶段划分,之后再分别针对目标子程序的各个阶段来开展符号执行测试,以实现对程序的阶段跨越,探索待测试程序中更深位置的路径,提高对待测试程序的代码覆盖率,提高程序检测效率和检测质量。
具体的,本发明在对待测试程序进行混合符号执行的过程中,对于待测试程序在种子路径上的每条语句或者指令,本发明均可以先行对其进行具体执行,之后紧接着再对其进行符号执行。
第二确定单元102,被配置为执行:在将种子文件输入待测试程序中进行混合符号执行的过程中,确定基本块执行信息的时间序列数据;
其中,时间序列数据可以由按发生时间的先后顺序所排列的多个元素数据构成,每个元素数据均可以包括有混合符号执行在时长为预设定值的相应时段内的基本块执行信息。
其中,本发明可以在对待测试程序进行混合符号执行的过程中,记录混合符号执行在各时段内的基本块执行信息。
其中,基本块执行信息可以体现混合符号执行在相应时段内对种子路径上各路径基本块的执行行为。可选的,基本块执行信息可以包括:混合符号执行在相应时段结束时的代码覆盖率,以及用于标记各路径基本块在相应时段内执行情况的执行标记数据。
可选的,执行标记数据可以包括1和0,1可以用于标记某个路径基本块被执行,0可以用于标记某个路径基本块未被执行。需要说明的是,本发明对于执行标记数据的具体数值或者具体类型均不做限定。
其中,代码覆盖率可以为混合符号执行在种子路径上已执行过的路径基本块的数量,与种子路径上路径基本块的总数量的比值。
需要说明的是,元素数据中的组成信息可以按照相应顺序排列在元素数据中。
具体的,本发明可以在将测试用例输入至待测试程序进行混合符号执行时,即按照周期时长来统计混合符号执行在种子路径上的基本块执行信息,以获得时长相等且连续的各时段对应的元素数据,从而获得时间序列数据。
其中,周期时长可以由技术人员根据实际情况进行制定,本发明对此不做限定。比如,本发明可以采用执行1000条指令所需的时间确定为周期时长。
划分单元103,被配置为执行:对时间序列数据进行聚类,以将目标子程序划分为至少一个阶段子程序,目标子程序由待测试程序在种子路径上的基本块构成;
其中,目标子程序可以为待测试程序在种子路径上的子程序。
其中,阶段子程序可以为目标子程序中某一个阶段的代码块,即具有相同或者相似执行行为的代码块。可以理解的是,阶段子程序同样可以为目标子程序中的一个子程序。
具体的,本发明在获得时间序列数据后,可以通过对时间序列数据中的元素数据进行聚类,来将处于连续时段且基本块执行信息为相同或相似的元素数据划分为同一簇,即将连续时段内所表现的整体执行行为为相同或相似的元素数据划分为同一簇。
具体的,本发明可以使用聚类算法进行上述聚类过程,比如K-means算法。
具体的,本发明可以在同一簇的元素数据内,将发生执行的路径基本块划分为同一阶段的代码块即同一阶段子程序。
第一记录单元104,被配置为执行:记录测试用例在至少一个阶段子程序中的种子状态值;
其中,种子状态值可以包括为测试用例在阶段子程序中经过输入相关的语句时形成的符号化路径约束表达式。
其中,输入相关的语句可以是包括有条件判断、错误检查或循环指令等可以在程序中产生路径分支的语句,即路径分支语句。
具体的,本发明可以在使用测试用例对目标子程序进行混合符号执行的过程中,记录测试用例在经过输入相关的语句时形成的符号化路径约束表达式。
可选的,第一记录单元104,可以包括:第八确定单元、第二记录单元和第九确定单元,其中:
第八确定单元,被配置为执行:在至少一个阶段子程序中,确定路径分支语句;
第二记录单元,被配置为执行:分别记录首次执行各路径分支语句完毕时形成的目标符号化路径约束表达式;
第九确定单元,被配置为执行:分别将各目标符号化路径约束表达式,确定为测试用例在相应的阶段子程序中的种子状态值。
其中,路径分支语句可以为上述输入相关语句。
具体的,本发明可以在确定阶段子程序中的路径分支语句后,记录符号执行在首次执行完路径分支语句时形成的目标符号化路径约束表达式。
具体的,本发明可以将记录的目标符号化路径约束表达式,确定为测试用例在相应的阶段子程序中的种子状态值。
具体的,本发明可以在进行混合符号执行的过程中,对应记录待测试程序中各输入相关语句的执行时间,以及执行完输入相关语句时所形成的符号化路径约束表达式,之后,本发明可以在划分好阶段子程序之后,确定各输入相关语句所属的阶段子程序,确定阶段子程序中执行时间最早的输入相关语句所对应的符号化路径约束表达式,将其确定为目标符号化路径约束表达式,即确定为测试用例在阶段子程序中的种子状态值。
可以理解的是,本发明可以将种子状态值作为测试用例的初始状态值输入至待测试程序中开展符号执行测试,此时符号执行无需进行复杂的路径探索,即可以在短时间内到达相应的输入相关语句处,对非种子路径的其它分支路径进行探索,在实现阶段穿越的情况下进行符号执行测试,可以有效提高代码覆盖率。
测试单元105,被配置为执行:按照符号执行策略,将至少一个种子状态值输入至待测试程序中开展符号执行测试。
其中,符号执行策略可以包括针对不同阶段子程序开展符号执行测试的执行顺序。
具体的,本发明可以按照符号执行策略所包括的各阶段子程序的执行顺序,依次针对相应的阶段子程序开展符号执行测试。
具体的,本发明可以按照符号执行策略,依次将各阶段子程序对应的种子状态值输入至待测试程序中开展符号执行测试。
其中,多数情况下,在待测试程序中处于前列位置的阶段子程序的路径约束条件比处于后列位置的阶段子程序的简单,因此,本发明在制定符号执行策略时,可以考虑阶段子程序在种子路径中的位置顺序。
可选的,测试单元105,被配置为执行:按照各阶段子程序在待测试程序中的位置顺序,依次将相应的种子状态值输入至待测试程序中开展符号执行测试。
按照各阶段子程序在待测试程序中的位置顺序,依次将相应的种子状态值输入至待测试程序中开展符号执行测试。
具体的,本发明可以先行针对在待测试程序中处于前列位置的阶段子程序开展符号执行测试,之后再针对后列位置的阶段子程序开展符号执行测试,有利于提高符号执行测试的测试效率。
本实施例提出的程序检测装置,可以通过将种子状态值作为测试用例的初始状态值输入待测试程序中,来针对相应的阶段子程序开展符号执行测试时,可以使得符号执行无需进行复杂的路径探索,即可以在短时间内到达至种子状态值在某个阶段子程序中对应的输入相关的语句处,并可以从该语句处继续开展符号执行测试,避免因执行循环或递归指令等情况而陷在某一个阶段子程序中,使得符号执行可以在有限时间内对不属于种子路径的其它分支路径进行更长时间的探索,执行其它分支路径在待测试程序中对应的代码,在有限时间内对待测试程序中更多或者更深的路径进行探索,提高对待测试程序的代码覆盖率,提高程序检测效率和检测质量。
基于图9所示结构示意图,本实施例提出第二种程序检测装置。在该装置中,第二确定单元102,可以包括:第三确定单元和第四确定单元,其中:
第三确定单元,被配置为执行:在将种子文件输入待测试程序中进行混合符号执行的过程中,分别确定时长相等且连续的多个时段对应的基本块向量,其中,基本块向量包括各路径基本块在相应时段内的执行标记数据,以及在相应时段结束时的代码覆盖率,路径基本块为待测试程序在种子路径上的基本块,执行标记数据用于标记路径基本块在相应时段内是否被执行;
第四确定单元,被配置为执行:将确定的各基本块向量确定为时间序列数据。
其中,基本块执行信息可以包括各路径基本块在相应时段内的执行标记数据和混合符号执行在相应时段结束时的代码覆盖率。
其中,每个时段对应的基本块向量均可以包括种子路径上的各路径基本块在相应时段内的执行标记数据,以及混合符号执行在相应时段结束时的代码覆盖率。
其中,本发明可以在使用测试用例对目标子程序进行混合符号执行的过程中,周期性的统计混合符号执行在相应时段内的基本块执行信息。
需要说明的是,每个基本块向量均可以作为时间序列数据中的一个元素数据。本发明可以按照时间顺序,对基本块向量进行排列,以获得时间序列数据。
具体的,本发明可以将代码覆盖率加入至基本块向量中,使得后续在使用时间序列数据进行聚类,将目标子程序划分为阶段子程序时,可以将处于相邻时段且基本块执行信息相同或者相似的基本块向量划分为同一簇,提高对目标子程序进行阶段划分的准确性。
本实施例提出的程序检测装置,可以分别确定多个时段对应的基本块向量,并可以确定的基本块向量作为时间序列数据,提高对目标子程序进行阶段划分的准确性,以提高对待测试程序的检测效率。
基于上述第二种程序检测装置,本实施例提出第三种程序检测装置。在第三种程序检测装置中,第三确定单元可以包括:第二记录单元、处理单元、获得单元、计算单元和第五确定单元,其中:
第二记录单元,被配置为执行:在将种子文件输入待测试程序中进行混合符号执行的过程中,分别在时长相等且连续的多个时段内,记录各路径基本块的执行标记数据;
处理单元,被配置为执行:分别对各时段内的执行标记数据进行归一化处理;
获得单元,被配置为执行:获得各时段的归一化处理后数据;
计算单元,被配置为执行:分别计算在各时段结束时的代码覆盖率;
第五确定单元,被配置为执行:分别将各时段的归一化处理后数据和相应的代码覆盖率确定为一个基本块向量。
具体的,本发明可以分别在时长相等且连续的多个时段内,记录目标子程序上各路径基本块的执行标记数据。
其中,本发明可以分别在各时段内,将各路径基本块的执行标记数据进行归一化处理。
具体的,本发明可以在进行归一化处理时,将各路径基本块的执行标记数据除以相应时段内执行标记数据的和值,而相除后的数据即为归一化处理后数据。
具体的,本发明可以分别在各时段结束时,获得各时段对应的代码覆盖率。
具体的,对于任一个时段内的归一化处理后数据和相应的代码覆盖率,本发明均可以将该时段内的归一化处理后数据中的各数据和相应的代码覆盖率均确定为一个基本块向量中的元素,以获得相应的一个基本块向量。
需要说明的是,本发明对于归一化处理后数据与代码覆盖率在基本块向量中所处的位置不做限定。
本实施例提出的程序检测装置,可以分别记录和统计路径基本块在多个时段内的执行标记数据和相应的代码覆盖率,获得相应的基本块向量,提高对目标子程序进行阶段划分的准确性,从而提高对待测试程序的检测效率。
基于第三种程序检测装置,本实施例提出第四种程序检测装置。在第四种程序检测装置中,划分单元103,可以包括:聚类单元、第六确定单元和第七确定单元,其中:
聚类单元,被配置为执行:对各基本块向量进行聚类;
第六确定单元,被配置为执行:在同一簇内的各基本块向量的执行标记数据中,确定第一标记数据,第一标记数据为用于标记路径基本块被执行的执行标记数据;
第七确定单元,被配置为执行:将同一簇内的各第一标记数据对应的路径基本块确定为一个阶段子程序。
具体的,本发明可以在获得分别与多个时段对应的多个基本块向量后,对各基本块向量进行聚类。
具体的,本发明可以在属于同一簇内的基本块向量中,识别出用于标记路径基本块被执行的第一标记数据。
具体的,本发明可以先行确定同一簇内的第一数据所对应的被执行的各个路径基本块,之后将确定的各路径基本块确定为同一阶段子程序中的路径基本块,即将同一簇的基本块向量所对应的时段内被执行的路径基本块确定为同一阶段子程序的路径基本块,以确定出至少一个阶段子程序。
需要说明的是,本发明可以针对属于一个簇内的各基本块向量,相应确定一个阶段子程序。如果聚类后可以获得多个簇,则本发明可以相应的将目标子程序划分为多个阶段子程序。
本实施例提出的程序检测装置,可以将同一簇内发生执行的路径基本块确定为目标子程序中的同一阶段子程序,提高对目标子程序进行阶段划分的准确性,从而提高对待测试程序的检测效率。
还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括要素的过程、方法、商品或者设备中还存在另外的相同要素。
以上仅为本申请的实施例而已,并不用于限制本申请。对于本领域技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本申请的权利要求范围之内。

Claims (10)

1.一种程序检测方法,其特征在于,包括:
将种子文件输入待测试程序中进行混合符号执行,以确定所述待测试程序中的种子路径,所述种子文件中包括测试用例;
在将所述种子文件输入所述待测试程序中进行混合符号执行的过程中,确定基本块执行信息的时间序列数据;
对所述时间序列数据进行聚类,以将目标子程序划分为至少一个阶段子程序,所述目标子程序由所述待测试程序在所述种子路径上的基本块构成;
记录所述测试用例在至少一个所述阶段子程序中的种子状态值;
按照符号执行策略,将至少一个所述种子状态值输入至所述待测试程序中开展符号执行测试。
2.根据权利要求1所述的方法,其特征在于,所述确定基本块执行信息的时间序列数据,包括:
分别确定时长相等且连续的多个时段对应的基本块向量,其中,所述基本块向量包括各路径基本块在相应时段内的执行标记数据,以及在相应时段结束时的代码覆盖率,所述路径基本块为所述待测试程序在所述种子路径上的基本块,所述执行标记数据用于标记所述路径基本块在相应时段内是否被执行;
将确定的各所述基本块向量确定为所述时间序列数据。
3.根据权利要求2所述的方法,其特征在于,所述分别确定时长相等且连续的多个时段对应的基本块向量,包括:
分别在时长相等且连续的多个时段内,记录各所述路径基本块的执行标记数据;
分别对各所述时段内的所述执行标记数据进行归一化处理,获得各所述时段的归一化处理后数据;
分别计算在各所述时段结束时的代码覆盖率;
分别将各所述时段的所述归一化处理后数据和相应的代码覆盖率确定为一个基本块向量。
4.根据权利要求2或3所述的方法,其特征在于,所述对所述时间序列数据进行聚类,以将目标子程序划分为至少一个阶段子程序,包括:
对各所述基本块向量进行聚类;
在同一簇内的各基本块向量的执行标记数据中,确定第一标记数据,所述第一标记数据为用于标记路径基本块被执行的执行标记数据;
将同一簇内的各所述第一标记数据对应的路径基本块确定为一个所述阶段子程序。
5.根据权利要求1所述的方法,其特征在于,所述记录所述测试用例在至少一个所述阶段子程序中的种子状态值,包括:
在至少一个所述阶段子程序中,确定路径分支语句;
分别记录首次执行各所述路径分支语句完毕时形成的目标符号化路径约束表达式;
分别将各所述目标符号化路径约束表达式,确定为所述测试用例在相应的所述阶段子程序中的种子状态值。
6.根据权利要求1所述的方法,其特征在于,所述按照符号执行策略,将至少一个所述种子状态值输入至所述待测试程序中开展符号执行测试,包括:
按照各所述阶段子程序在所述待测试程序中的位置顺序,依次将相应的所述种子状态值输入至所述待测试程序中开展符号执行测试。
7.一种程序检测装置,其特征在于,包括:第一确定单元、第二确定单元、划分单元、第一记录单元和测试单元,其中:
所述第一确定单元,被配置为执行:将种子文件输入待测试程序中进行混合符号执行,以确定所述待测试程序中的种子路径,所述种子文件中包括测试用例;
所述第二确定单元,被配置为执行:在将所述种子文件输入所述待测试程序中进行混合符号执行的过程中,确定基本块执行信息的时间序列数据;
所述划分单元,被配置为执行:对所述时间序列数据进行聚类,以将目标子程序划分为至少一个阶段子程序,所述目标子程序由所述待测试程序在所述种子路径上的基本块构成;
所述第一记录单元,被配置为执行:记录所述测试用例在至少一个所述阶段子程序中的种子状态值;
所述测试单元,被配置为执行:按照符号执行策略,将至少一个所述种子状态值输入至所述待测试程序中开展符号执行测试。
8.根据权利要求7所述的装置,其特征在于,所述第二确定单元,包括:第三确定单元和第四确定单元,其中:
所述第三确定单元,被配置为执行:在将所述种子文件输入所述待测试程序中进行混合符号执行的过程中,分别确定时长相等且连续的多个时段对应的基本块向量,其中,所述基本块向量包括各路径基本块在相应时段内的执行标记数据,以及在相应时段结束时的代码覆盖率,所述路径基本块为所述待测试程序在所述种子路径上的基本块,所述执行标记数据用于标记所述路径基本块在相应时段内是否被执行;
所述第四确定单元,被配置为执行:将确定的各所述基本块向量确定为所述时间序列数据。
9.根据权利要求8所述的装置,其特征在于,所述第三确定单元包括:第二记录单元、处理单元、获得单元、计算单元和第五确定单元,其中:
所述第二记录单元,被配置为执行:在将所述种子文件输入所述待测试程序中进行混合符号执行的过程中,分别在时长相等且连续的多个时段内,记录各所述路径基本块的执行标记数据;
所述处理单元,被配置为执行:分别对各所述时段内的所述执行标记数据进行归一化处理;
所述获得单元,被配置为执行:获得各所述时段的归一化处理后数据;
所述计算单元,被配置为执行:分别计算在各所述时段结束时的代码覆盖率;
所述第五确定单元,被配置为执行:分别将各所述时段的所述归一化处理后数据和相应的代码覆盖率确定为一个基本块向量。
10.根据权利要求8或9所述的装置,其特征在于,所述划分单元,包括:聚类单元、第六确定单元和第七确定单元,其中:
所述聚类单元,被配置为执行:对各所述基本块向量进行聚类;
所述第六确定单元,被配置为执行:在同一簇内的各基本块向量的执行标记数据中,确定第一标记数据,所述第一标记数据为用于标记路径基本块被执行的执行标记数据;
所述第七确定单元,被配置为执行:将同一簇内的各所述第一标记数据对应的路径基本块确定为一个所述阶段子程序。
CN202110325581.6A 2021-03-26 2021-03-26 一种程序检测方法及装置 Pending CN112988587A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202110325581.6A CN112988587A (zh) 2021-03-26 2021-03-26 一种程序检测方法及装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202110325581.6A CN112988587A (zh) 2021-03-26 2021-03-26 一种程序检测方法及装置

Publications (1)

Publication Number Publication Date
CN112988587A true CN112988587A (zh) 2021-06-18

Family

ID=76333840

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202110325581.6A Pending CN112988587A (zh) 2021-03-26 2021-03-26 一种程序检测方法及装置

Country Status (1)

Country Link
CN (1) CN112988587A (zh)

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN113536318A (zh) * 2021-06-30 2021-10-22 北京紫光展锐通信技术有限公司 信息处理方法及相关装置
CN115543719A (zh) * 2022-11-24 2022-12-30 飞腾信息技术有限公司 基于芯片设计的组件优化方法、装置、计算机设备及介质
CN116894209A (zh) * 2023-09-05 2023-10-17 北京开源芯片研究院 采样点的分类方法、装置、电子设备及可读存储介质

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN113536318A (zh) * 2021-06-30 2021-10-22 北京紫光展锐通信技术有限公司 信息处理方法及相关装置
CN115543719A (zh) * 2022-11-24 2022-12-30 飞腾信息技术有限公司 基于芯片设计的组件优化方法、装置、计算机设备及介质
CN116894209A (zh) * 2023-09-05 2023-10-17 北京开源芯片研究院 采样点的分类方法、装置、电子设备及可读存储介质
CN116894209B (zh) * 2023-09-05 2023-12-22 北京开源芯片研究院 采样点的分类方法、装置、电子设备及可读存储介质

Similar Documents

Publication Publication Date Title
CN112988587A (zh) 一种程序检测方法及装置
CN110580226B (zh) 操作系统级程序的目标码覆盖率测试方法、系统及介质
CN102063328B (zh) 一种用于检测中断驱动型程序数据竞争的系统
US9329974B2 (en) Technologies for determining binary loop trip count using dynamic binary instrumentation
CN107193732B (zh) 一种基于路径比对的校验函数定位方法
CN111008154B (zh) 一种基于强化学习的Android应用自动测试方法及系统
CN107085533B (zh) 一种指针修改影响的分析方法和系统
CN104978272A (zh) 一种用于数据竞争检测的程序调度方法
CN110851353B (zh) 一种基于Delta Debugging与约束求解的并发程序缺陷定位方法
CN111858358A (zh) 一种面向二进制代码的导向型模糊测试方法
CN107203469B (zh) 基于机器学习的编译器测试加速方法
CN108021495B (zh) 基于回放的代码调试方法
CN110083538B (zh) 一种并发程序噪声注入方法
CN110347572B (zh) 一种性能日志输出方法、装置、系统、设备及介质
US6546526B2 (en) Active trace debugging for hardware description languages
CN109002723A (zh) 一种分段式符号执行方法
CN114138669A (zh) 一种基于函数级选择符号化混合执行的软件自动测试方法
CN110515655B (zh) 一种数据指令分析方法
CN108415836B (zh) 利用应用程序检测计算机系统性能变化的方法和系统
Malburg et al. Tuning dynamic data flow analysis to support design understanding
CN111382059A (zh) 代码质量评价方法及系统
CN110427320A (zh) 一种轻量级嵌入式程序控制流异常定位检测方法
CN117688564B (zh) 一种用于智能合约事件日志的检测方法、装置和存储介质
CN113468047B (zh) 基于启发式规则的并发式自适应随机测试方法
CN103793623B (zh) 碱基序列重组系统及方法

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