
1.本发明属于计算机技术领域,尤其涉及一种支持自动化检测程序缺陷的方法和系统。
背景技术:2.目前,对软件系统进行缺陷测试时,传统的测试方法对人员技术水平要求高,工作量大,且对于某些超出语言标准的编译器特性支持性不够完善,测试系统的兼容扩展性不尽人意,现有缺陷查找与验证技术自动化程度不够高和通用性弱,因此亟需一种可自动化检测程序缺陷的方法。
技术实现要素:3.针对以上技术问题,本发明提供一种支持自动化检测程序缺陷的方法和系统。
4.本发明解决其技术问题采用的技术方案是:一种支持自动化检测程序缺陷的方法,方法包括以下步骤:步骤s100:获取待测试程序,按照预设的程序完备配置原则给待测试程序配置信息得到完备后的待测试程序;步骤s200:分析完备后的待测试程序,解析并提取待测函数和待测函数信息,并将完备后的待测试程序编译成llvm中间码;步骤s300:分析llvm中间码得到中间码指令上的附带信息,根据附带信息和待测函数信息对待测函数进行代码插桩,生成符号执行驱动程序;步骤s400:通过执行分析技术分析符号执行驱动程序,生成待测试程序的触发缺陷测试数据;步骤s500:解释器实际执行缺陷测试数据,输出执行结果得到待测试程序的缺陷测试结果。
5.优选地,步骤s200中的待测函数信息至少包括待测函数的函数名、代码行数统计信息、分支统计信息、圈复杂度、控制流信息、影响待测函数行为的函数参数、全局变量和局部静态变量。
6.优选地,步骤s200包括:步骤s210:分析完备后的待测试程序获取完备后的待测试程序中的关键字;步骤s220:当根据关键字判断对应的语言不在预设的编译环境的方言范围内时,采用拓展开源框架clang的方式对待测试程序进行兼容后,解析并提取待测函数和待测函数信息,并将完备后的待测试程序编译成llvm中间码;当根据关键字判断对应的语言在预设的编译环境的方言范围内时,解析并提取待测函数和待测函数信息,并将完备后的待测试程序编译成llvm中间码。
7.优选地,步骤s300包括:步骤s310:分析llvm中间码得到中间码指令上的附带信息;
步骤s320:根据影响待测函数行为的函数参数、全局变量和局部静态变量进行代码插桩,插桩的过程中,将影响函数行为的变量的名称和类型添加到附带信息中进行标记,生成调用待测函数的符号执行驱动函数。
8.优选地,步骤s400包括:步骤s410:将标记的变量进行符号化,没有标记的变量给予其在待测函数中初始化时的真实值,得到符号化后的驱动函数;步骤s420:利用符号执行引擎解释执行符号化后的驱动函数,并记录路径所探索过的分支,每解释一条指令都对分支进行排序,以获得当前状态下探索分支数量最多的路径,且继续解释该路径,直到该路径走到函数的跳出语句,在探索分支过程中,对预先设置的可触发漏洞的指令添加漏洞触发的约束,将其加入到路径约束组中进行求解以判定当前的路径条件是否会触发漏洞,若求解成功则可以得到漏洞触发的输入,将漏洞触发的输入作为缺陷测试用例数据。
9.优选地,步骤s500包括:将缺陷测试用例数据封装成测试驱动程序,通过在解释器中将预设定义的程序声明作为解释器内嵌函数,解释执行相应的测试驱动程序,在解释执行的过程中收集执行指令的信息并导出到输出文件中,得到缺陷测试结果。
10.优选地,执行指令的信息包括指令的行数、调用指令调用的次数和是否引发缺陷。
11.一种支持自动化检测程序缺陷的系统,包括:程序配置模块,用于获取待测试程序,按照预设的程序完备配置原则给待测试程序配置信息得到完备后的待测试程序;编译模块,用于分析完备后的待测试程序,解析并提取待测函数和待测函数信息,并将完备后的待测试程序编译成llvm中间码;代码插桩模块,用于分析llvm中间码得到中间码指令上的附带信息,根据附带信息和待测函数信息对待测函数进行代码插桩,生成符号执行驱动程序;触发缺陷测试数据生成模块,用于通过执行分析技术分析符号执行驱动程序,生成待测试程序的触发缺陷测试数据;缺陷验证模块,用于解释器实际执行缺陷测试数据,输出执行结果得到待测试程序的缺陷测试结果。
12.上述一种支持自动化检测程序缺陷的方法和系统,分析用户待测试程序的源代码级别程序信息,提取程序的待测函数及待测函数信息,并且将程序代码编译成llvm 中间码,通过待测函数信息和中间码的交互,利用动态符号执行技术,为待测试程序生成触发缺陷测试数据,并为缺陷输入封装成测试驱动程序,通过基于llvm中间码的解释器解释执行每个测试驱动程序,验证程序的缺陷。用户仅仅需要将待测试程序导入到系统,通过扩展优化llvm中间码、编译前端的功能,让待测试程序信息的收集自动化,同时让触发缺陷的测试用例的生成和执行自动化,无需任何人工干预,大大减少了缺陷测试的工作量,并且系统的通用性强,保证系统在进行测试时的通用性和自动化程度。
附图说明
13.图1为本发明一实施例提供的一种支持自动化检测程序缺陷的方法流程图。
具体实施方式
14.为了使本技术领域的人员更好地理解本发明的技术方案,下面结合附图对本发明作进一步的详细说明。
15.在一个实施例中,如图1所示,一种支持自动化检测程序缺陷的方法,方法包括以下步骤:步骤s100:获取待测试程序,按照预设的程序完备配置原则给待测试程序配置信息得到完备后的待测试程序。
16.具体地,输入待测试程序,配置好待测试程序的宏信息,头文件搜索路径等,确保待测试程序可正常完成编译。预设的程序完备配置原则待测试程序可正常完成编译,所谓的正常完成编译是指待测试程序必须在编译阶段没有语法错误,链接阶段没有符号重名的错误。
17.步骤s200:步骤s200:分析完备后的待测试程序,解析并提取待测函数和待测函数信息,并将完备后的待测试程序编译成llvm中间码。
18.具体地,步骤s200中的待测函数信息至少包括待测函数的函数名、代码行数统计信息、分支统计信息、圈复杂度、控制流信息、影响待测函数行为的函数参数、全局变量和局部静态变量。
19.在一个实施例中,步骤s200包括:步骤s210:分析完备后的待测试程序获取完备后的待测试程序中的关键字;步骤s220:当根据关键字判断对应的语言不在预设的编译环境的方言范围内时,采用拓展开源框架clang的方式对待测试程序进行兼容后,解析并提取待测函数和待测函数信息,并将完备后的待测试程序编译成llvm中间码;当根据关键字判断对应的语言在预设的编译环境的方言范围内时,解析并提取待测函数和待测函数信息,并将完备后的待测试程序编译成llvm中间码。
20.具体地,对于某些编译环境的方言,如嵌入式程序中的中断(interrupt)关键字,对应的语言不在预设的编译环境的方言范围内时,采用拓展开源框架clang的方式进行兼容,满足超出语言标准部分的功能,实现提取待测函数及其相关信息通用性。
21.步骤s300:分析llvm中间码得到中间码指令上的附带信息,根据附带信息和待测函数信息对待测函数进行代码插桩,生成符号执行驱动程序。
22.在一个实施例中,步骤s300包括:步骤s310:分析llvm中间码得到中间码指令上的附带信息;步骤s320:根据影响待测函数行为的函数参数、全局变量和局部静态变量进行代码插桩,插桩的过程中,将影响函数行为的变量的名称和类型添加到附带信息中进行标记,生成调用待测函数的符号执行驱动函数。
23.具体地,根据每个待测函数信息,基于llvm中间码对待测函数进行代码插桩,生成符号执行驱动函数,即根据影响待测函数行为的函数 参数、全局变量和局部静态变量进行代码插桩,生成一个调用待测函数的符号执行驱动函数,该驱动函数作为符号执行引擎的输入。插桩的过程中会通过llvm中间码获取在指令上的附带信息,即metadata信息,通过修改这个附带信息,将变量的名称和类型添加到其中,从而标记出哪些变量是影响函数行为的变量,以作为符号执行引擎自动符号化的依据。的自动符号化依据,即根据影响函数行为
的变量,包括函数的参数、全局变量在内存中的值是会影响到整个函数行为的,为了让符号执行引擎可以自动地分析测函数,生成测试用例,需要对它们进行识别和自动符号化。
24.步骤s400:通过执行分析技术分析符号执行驱动程序,生成待测试程序的触发缺陷测试数据。
25.在一个实施例中,步骤s400包括:步骤s410:将标记的变量进行符号化,没有标记的变量给予其在待测函数中初始化时的真实值,得到符号化后的驱动函数;步骤s420:利用符号执行引擎解释执行符号化后的驱动函数,并记录路径所探索过的分支,每解释一条指令都对分支进行排序,以获得当前状态下探索分支数量最多的路径,且继续解释该路径,直到该路径走到函数的跳出语句,在探索分支过程中,对预先设置的可触发漏洞的指令添加漏洞触发的约束,将其加入到路径约束组中进行求解以判定当前的路径条件是否会触发漏洞,若求解成功则可以得到漏洞触发的输入,将漏洞触发的输入作为缺陷测试用例数据。
26.具体地,通过混合符号执行技术分析s300生成的驱动函数,生成用于单元测试待测函数的测试用例数据。每个待测函数都会生成一个驱动函数进行符号执行,从驱动函数开始分析,将s300标记的变量进行符号化,而没有标记的变量给予其在函数中初始化时候的真实值,然后利用符号执行引擎解释执行程序,通过记录路径所探索过的分支,每解释一条指令都对分支进行排序,以获得当前状态下探索分支数量最多的路径,且继续解释该路径,直到路径走到函数的跳出语句。在路径探索的过程中,对预先设置的可触发漏洞的指令添加漏洞触发的约束,然后将其加入到路径约束组中进行求解,判定当前的路径条件是否会触发漏洞,若求解成功则可以得到漏洞触发的输入,作为缺陷测试用例数据。上述符号执行生成缺陷测试用例的过程是全自动化,无需人工干预的。
27.步骤s500:解释器实际执行缺陷测试数据,输出执行结果得到待测试程序的缺陷测试结果。
28.在一个实施例中,步骤s500包括:将缺陷测试用例数据封装成测试驱动程序,通过在解释器中将预设定义的程序声明作为解释器内嵌函数,解释执行相应的测试驱动程序,在解释执行的过程中收集执行指令的信息并导出到输出文件中,得到缺陷测试结果。进一步地,执行指令的信息包括指令的行数、调用指令调用的次数和是否引发缺陷。
29.具体地,解释器实际解释执行缺陷测试用例,输出缺陷测试信息。对s400中生成的一组缺陷测试用例数据,再利用系统内定义的一套函数声明接口(此处的接口为自主开发,目的是为了支持解释器来执行生成的测试用例程序),将测试用例数据封装成测试驱动程序,通过在解释器中将这套程序声明作为解释器内嵌函数实现其函数功能,解释执行相应的测试驱动程序,在解释执行的过程中收集执行指令的信息,包括指令的行数、调用指令调用的次数和是否引发缺陷,并导出到输出文件中,得到缺陷测试的结果。上述解释器解释执行测试用例的过程是全自动化,无需人工干预的。
30.在一个具体的实施例中,关键步骤的具体实施方法如下:int test(int lhs, int rhs) {
ꢀꢀꢀꢀꢀꢀ
int retvalue = 10;
if(lhs 》 rhs)
ꢀꢀꢀꢀꢀꢀ
return retvalue /rhs;
ꢀꢀꢀꢀꢀꢀ
else {
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
return retvalue;}}通过的缺陷测试系统对如上test函数进行缺陷测试流程:(1)假设程序仅仅包含如上test函数,该函数没有语法错误,可以正确的编译,同时由于我们不需要将其编译链接为可执行程序,所以也不需要main函数。
31.(2)导入程序后,缺陷测试系统解析程序,利用开源框架llvm的组件clang编译器通过词法分析、语法分析、中间代码生成、中间代码链接得到程序的llvm中间码文件。在这个过程的语法树阶段进行语法树分析得出上述待测函数test的函数名为test(如果是c++程序的话会得到其mangle后名字),圈复杂度为2,代码行数为7,分支数为2。(3)根据在(2)得到的函数名,在程序的llvm中间码文件中寻找到test函数,分析得到test的参数为int类型的lhs和rhs,生成如下驱动函数调用test函数,同时对驱动函数中传递给test函数的实参添加附带信息,作为其标识。
32.void test_driver(int loop){
ꢀꢀꢀꢀꢀꢀ
int a,b; // a和b变量都会添加标识信息,因为其将作为传递给test的实参
ꢀꢀꢀꢀꢀꢀ
for(int i=0;i《loop;++i) {
ꢀꢀꢀꢀꢀꢀ
test(a,b);}}(4)符号执行引擎直接将test_driver作为入口开始分析,由于局部变量a和b在s3阶段被标识了,所以引擎会直接对其自动符号化,以便后续的符号执行。驱动函数的loop参数会被默认设置为1,表示只调用test一次。在符号执行引擎分析到test函数的时候,其中的retvalue被其赋予了实际值10,所以符号执行引擎不将其符号化,而是直接用实际值10初始化retvalue的内存。在符号执行结束后,生成两组测试用例,这两组测试用例可以分别覆盖到if的真分支和假分支,测试用例就是传递给test函数的实际参数的值。在符号执行中,路径搜索时,引擎检测到触发操作指令“/”, 故对可能触发漏洞的指令添加漏洞触发的约束,然后将其加入到路径约束组中进行求解,当b为0时,求解成功则可以得到漏洞触发的输入。
33.(5)对于(4)生成的每一个测试用例,分别封装成测试驱动函数,使得其实现调用test函数的功能。以下函数即封装测试用例的调用test函数的驱动函数,它会使得test函数从if的真分支返回。
34.void test_driver_interpret() {int a =1, b=0;test(a, b);}
同时在解释执行的过程中,统计解释执行的代码行号。
35.上述一种支持自动化检测程序缺陷的方法,借助开源框架clang和llvm,分析用户待测试程序的源代码级别程序信息,提取程序的待测函数及相关的信息,并且将程序代码编译成llvm 中间码。通过待测试程序的相关信息和中间码的交互,利用动态符号执行技术,为待测试程序生成触发缺陷的输入,并为缺陷输入封装成测试驱动程序,通过基于llvm中间码的解释器解释执行每个测试驱动程序,验证程序的缺陷。用户仅仅需要将待测试程序导入到系统,通过扩展优化llvm中间码、编译前端的功能,让待测试程序信息的收集自动化,同时让触发缺陷的测试用例的生成和执行自动化,无需任何人工干预,,大大减少了缺陷测试的工作量,系统的通用性强,不仅仅支持c/c++标准的特性,而且对于某些特定的嵌入式平台上的编译器提供的语言特性也可以支持,保证系统在进行测试时的通用性和自动化程度。
36.一种支持自动化检测程序缺陷的系统,包括:程序配置模块,用于获取待测试程序,按照预设的程序完备配置原则给待测试程序配置信息得到完备后的待测试程序;编译模块,用于分析完备后的待测试程序,解析并提取待测函数和待测函数信息,并将完备后的待测试程序编译成llvm中间码;代码插桩模块,用于分析llvm中间码得到中间码指令上的附带信息,根据附带信息和待测函数信息对待测函数进行代码插桩,生成符号执行驱动程序;触发缺陷测试数据生成模块,用于通过执行分析技术分析符号执行驱动程序,生成待测试程序的触发缺陷测试数据;缺陷验证模块,用于解释器实际执行缺陷测试数据,输出执行结果得到待测试程序的缺陷测试结果。
37.关于支持自动化检测程序缺陷的系统的具体限定可以参见上文中对于支持自动化检测程序缺陷的方法的限定,在此不再赘述。上述支持自动化检测程序缺陷的系统中的各个模块可全部或部分通过软件、硬件及其组合来实现。上述各模块可以硬件形式内嵌于或独立于计算机设备中的处理器中,也可以以软件形式存储于计算机设备中的存储器中,以便于处理器调用执行以上各个模块对应的操作。
38.以上对本发明所提供的一种支持自动化检测程序缺陷的方法和系统进行了详细介绍。本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的核心思想。应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以对本发明进行若干改进和修饰,这些改进和修饰也落入本发明权利要求的保护范围内。