CN114238154B - 一种符号执行方法、单元测试方法、电子设备及存储介质 - Google Patents

一种符号执行方法、单元测试方法、电子设备及存储介质 Download PDF

Info

Publication number
CN114238154B
CN114238154B CN202210169478.1A CN202210169478A CN114238154B CN 114238154 B CN114238154 B CN 114238154B CN 202210169478 A CN202210169478 A CN 202210169478A CN 114238154 B CN114238154 B CN 114238154B
Authority
CN
China
Prior art keywords
program
branch
path
tested
function
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
CN202210169478.1A
Other languages
English (en)
Other versions
CN114238154A (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.)
Hunan Panlian Xin'an Information Technology Co ltd
Original Assignee
Hunan Panlian Xin'an Information Technology Co 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 Hunan Panlian Xin'an Information Technology Co ltd filed Critical Hunan Panlian Xin'an Information Technology Co ltd
Priority to CN202210169478.1A priority Critical patent/CN114238154B/zh
Publication of CN114238154A publication Critical patent/CN114238154A/zh
Application granted granted Critical
Publication of CN114238154B publication Critical patent/CN114238154B/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/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/362Software debugging
    • G06F11/3644Software debugging by instrumenting at runtime
    • 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/3676Test management for coverage analysis
    • 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

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Computer Hardware Design (AREA)
  • Quality & Reliability (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Debugging And Monitoring (AREA)

Abstract

本发明公开了一种符号执行方法、单元测试方法、电子设备及存储介质,该方法包括:遍历待分析程序的所有指令,建立程序分支表;对待分析程序的程序路径建立路径分支表;确认程序分支表中的所有分支未被访问,在当前路径下分析指令,收集已访问的分支记录,并将已访问的分支记录更新到路径分支表;对所有的路径按照路径分支表中已经访问的分支数进行排序;确认当前路径已覆盖到新的分支,保留当前路径并将当前路径覆盖的分支和测试用例缓存;输出缓存的测试用例数据。该符号执行方法,通过采用覆盖率优先的路径搜索策略,对循环进行特殊的处理,使得在符号执行的过程中不至于陷入到某一段代码一直无法跳出导致超时,保证了符号执行的可行性。

Description

一种符号执行方法、单元测试方法、电子设备及存储介质
技术领域
本发明涉及计算机程序测试技术领域,具体而言,涉及一种符号执行方法、单元测试方法、电子设备及存储介质。
背景技术
符号执行(Symbolic Execution)是一种程序分析技术,它可以通过分析程序来获得让特定代码区域执行的输入,程序的行为受内存中变量的影响,而使用符号执行分析一个程序时,该程序会将内存中的变量看成符号值而不是一般程序的具体值来执行程序。在到达目标程序时,符号执行引擎可以得到相应的路径约束,然后通过约束求解器来得到可以触发目标代码的具体值。
对于控制流简单的程序,采用经典图算法中的DFS(Depth-First-Search,深度优先搜索算法)和BFS(Breadth First Search,宽度优先搜索算法,又称广度优先搜索)搜索策略便可以轻松生成高覆盖率甚至全覆盖的输入,但是对于控制流较为复杂的程序,尤其是程序中循环逻辑较为复杂的部分,采用DFS和BFS搜索策略很难在规约时间内生成高覆盖率的输入,而在单元测试的时候,也不可能无限的增大规约时间来获取测试用例。
因此,如何在合理的规约时间内生成高覆盖率的测试用例,是本领域技术人员亟需解决的技术问题。
发明内容
鉴于此,本发明提出了一种符号执行方法、单元测试方法、电子设备及存储介质,以克服单元测试自动化用例生成时存在的问题,以在规约时间内获取一组高覆盖率的测试用例。
一方面,本发明提出的符号执行方法,包括:
S1:遍历待分析程序的所有指令,建立程序分支表;
S2:对待分析程序的程序路径建立路径分支表;
S3:确认程序分支表中的所有分支未被访问,执行S4;
S4:在当前路径下分析指令,收集已访问的分支记录,并将已访问的分支记录更新到路径分支表;
S5:对所有的路径按照路径分支表中已经访问的分支数进行排序;
S6:确认当前路径已覆盖到新的分支,保留当前路径并将当前路径覆盖的分支和测试用例缓存;
S7:输出缓存的测试用例数据。
上述的符号执行方法,可选的,所述步骤S3还包括:
确认程序分支表中的所有分支已被访问,执行步骤S7。
上述的符号执行方法,可选的,所述步骤S6还包括:
确认当前路径未覆盖到新的分支,丢弃当前路径并跳转至步骤S3。
上述的符号执行方法,可选的,所述步骤S5还包括:
遍历排序后的路径,判断路径的当前待分析指令是否已经被访问,选取第一条当前待分析指令没有被访问的路径作为下一条路径。
上述的符号执行方法,可选的,所述步骤S1中,
所述程序分支表用于保存所述待分析程序中所有分支指令到指令指向的程序基本块的映射,并记录各所述程序基本块是否已经通过对应的分支指令访问;
所述步骤S2中,
所述路径分支表用于保存所述待分析程序中各程序路径上分支指令到指令指向的程序基本块的映射,并记录所述程序基本块是否已经通过对应的分支指令访问。
上述的符号执行方法,可选的,所述步骤S4还包括:
将当前指令设置为已访问状态,分析指令时对于分支跳转指令进行处理,所述处理包括识别分支指令是否代表循环、对循环进行分类、对死循环进行剪枝,其中,对循环分类为普通循环,死循环和符号化循环。
本方面一方面提出的符号执行方法,包括:遍历待分析程序的所有指令,建立程序分支表;对待分析程序的程序路径建立路径分支表;确认程序分支表中的所有分支未被访问,在当前路径下分析指令,收集已访问的分支记录,并将已访问的分支记录更新到路径分支表;对所有的路径按照路径分支表中已经访问的分支数进行排序;确认当前路径已覆盖到新的分支,保留当前路径并将当前路径覆盖的分支和测试用例缓存;输出缓存的测试用例数据。该符号执行方法,在程序规模较为复杂时,程序中循环的处理问题成为符号执行需要面临的问题,通过采用覆盖率优先的路径搜索策略,对循环进行特殊的处理,使得在符号执行的过程中不至于陷入到某一段代码一直无法跳出导致超时,保证了符号执行的实际可行性。
同时,由于采用了符号执行时高覆盖率优先的路径搜索算法,能够在单元测试时生成一组高覆盖率,无冗余的测试用例,结合循环的分类处理方式,能对存在死循环的代码也正常生成触发死循环的测试用例。另外,该路径搜索算法能极大的缩短测试用例生成时间,避免大量的无效符号执行。
另一方面,本发明提出的单元测试方法,包括如下步骤:
S10:获取待测程序;
S20:解析所述待测程序,提取所述待测程序的待测函数及所述待测函数的基础信息,将所述待测程序编译成中间码;
S30:根据每个所述待测函数的基础信息,对所述待测函数进行代码插桩,生成驱动函数;
S40:利用上述任一种所述的符号执行方法分析所述驱动函数,生成用于单元测试所述待测函数的测试用例;
S50:执行所述测试用例,反馈单元测试结果。
上述的单元测试方法,可选的,所述步骤S20中“将所述待测程序编译成中间码”包括:
利用开源框架LLVM分析所述待测程序,将待测程序编译成LLVM中间码;
所述步骤S30还包括:
分析所述LLVM中间码,根据所述待测函数的函数参数、全局变量和/或局部静态变量进行代码插桩,生成调用所述待测函数的适于符号执行的驱动函数,所述驱动函数作为符号执行引擎的输入;并将每个所述待测函数生成一个所述驱动函数进行符号执行;
标记所述待测函数的函数参数、全局变量和/或局部静态变量中影响所述待测函数行为的变量,以作为所述符号执行引擎自动符号化的依据。
本发明一方面提出的一种单元测试方法,包括:获取待测程序;解析待测程序,提取待测程序的待测函数及待测函数的基础信息,并利用开源框架LLVM分析待测程序,将待测程序编译成LLVM中间码;根据每个待测函数的基础信息,对待测函数进行代码插桩,生成驱动函数;利用符号执行方法分析驱动函数,生成用于单元测试待测函数的测试用例;执行测试用例,反馈单元测试结果。该单元测试方法,一方面,借助开源框架LLVM,分析用户待测程序的源代码级别程序信息,提取待测程序的待测函数及待测函数相关的基础信息,并且将待测程序的代码编译成定制的LLVM中间码。通过待测函数相关的基础信息和中间码的交互,利用动态符号执行方法,为每个待测函数生成高覆盖率的测试用例,并为每个测试用例封装成测试驱动程序,通过基于LLVM中间码的解释器解释执行每个测试驱动程序,可自动化的完成单元测试。另一方面,由于采用了符号执行时高覆盖率优先的路径搜索算法,能够在单元测试时生成一组高覆盖率,无冗余的测试用例。同时,该路径搜索算法,结合循环的分类处理方式,能对存在死循环的代码也正常生成触发死循环的测试用例。另外,该路径搜索算法能极大的缩短测试用例生成时间,避免大量的无效符号执行。
再一方面,本发明提出的一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现上述任一种符号执行方法或单元测试方法的步骤。
最后,本发明提出的一种计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现上述任一种符号执行方法或单元测试方法的步骤。
需要说明的是,与本发明的符号执行方法、单元测试方法、电子设备及存储介质相关的更多有益效果,将在实施例中进一步阐述。
附图说明
此处所说明的附图仅仅用来提供对本发明的进一步解释,构成被申请的一部分,并不构成对本发明的限定。在附图中:
图1为本发明具体实施例提出的一种符号执行方法的示意图;
图2为本发明具体实施例提出的一种符号执行方法的流程图;
图3为本发明具体实施例提出的一种单元测试方法的示意图。
具体实施方式
为了能够更清楚地理解本发明的上述目的、特征和优点,下面结合附图和具体实施方式对本发明进行进一步的详细描述。需要说明的是,在不冲突的情况下,本申请的实施例及实施例中的特征可以相互组合。
需要说明的是,本发明中的“和/或”,指既可以同时具备,也可以选择其中之一,如方案A和/或方案B,包括方案A、方案B、方案A且方案B此三种情况。
单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证,对于单元测试中单元的含义,一般来说,要根据实际情况去判定其具体含义,如C语言中单元指一个函数,Java里单元指一个类,图形化的软件中可以指一个窗口或一个菜单等,总的来说,单元就是人为规定的最小的被测功能模块。在单元测试自动化用例生成中,需要采用到符号执行技术,一方面,本发明具体实施例提出的一种符号执行方法,通过提出一种启发式的覆盖率优先的符号执行路径搜索策略,以实现在规约时间内获取一组高覆盖率的测试用例的目的。
具体地,本发明具体实施例提出的一种符号执行方法,如图1和图2所示,包括如下步骤:
S1:遍历待分析程序的所有指令,建立程序分支表。
该步骤中,程序分支表是整个待分析程序中的分支记录,还可包含了分支信息,可以用来判断分支指令是否关联的死循环,具体的,程序分支表用于保存待分析程序中所有分支指令到指令指向的程序基本块的映射,并记录各程序基本块是否已经通过对应的分支指令访问,最关键的是程序分支表保存的是整个程序中所有分支指令到指令指向的程序基本块的映射。
S2:对待分析程序的程序路径建立路径分支表。
该步骤中,路径分支表所记录的信息同程序分支表一样,唯一的区别在于其仅仅记录一条程序路径上分支指令到程序基本块的映射,而不是整个程序中分支指令到程序基本块的映射,即路径分支表用于保存待分析程序中各程序路径上分支指令到指令指向的程序基本块的映射,并记录程序基本块是否已经通过对应的分支指令访问,以在后续步骤中,依照程序的执行流依次分析指令,在分析指令的同时更新路径分支表。需要说明的是,路径分支表是某一条程序路径下的分支记录,它是随着分析的进行慢慢递增,当然,程序分支表也是在分析过程中会被更新的,因为在分析的过程中会对不可达的分支进行剪枝操作。
S3:确认程序分支表中的所有分支未被访问,执行S4。
在分析指令前,先判断程序分支表中的所有分支是否已经被访问,如果确认程序分支表中的所有分支未被访问,执行步骤S4;当然,如果确认程序分支表中的所有分支已被访问,在跳转执行步骤S7。
S4:在当前路径下分析指令,收集已访问的分支记录,并将已访问的分支记录更新到路径分支表。
本步骤中,在当前路径下分析指令,收集已访问的分支记录,并且将其更新到路径分支表,同时将当前指令设置为已访问状态,分析指令时对于分支跳转指令进行处理,处理包括识别分支指令是否代表循环、对循环进行分类、对死循环进行剪枝,通过本步骤,将当前指令设置为已访问状态,分析指令的时候对于分支跳转指令进行一系列的处理,包括识别分支指令是否代表循环,循环和分支都会使得程序发生跳转,在编译期间直接将一条分支指令的来源进行缓存,所以对于一条分支指令,可以直接通过缓存获取分支指令是否来源于一个循环;对死循环进行剪枝,即从程序分支表中删除程序无法到达的分支,防止符号执行过程无法正常终止;对循环进行分类,分为普通循环,死循环和符号化循环,为了防止由于循环引起搜索进入死锁状态(陷入到循环中不跳出),同时为了提高搜索的高效性,设置这三种循环的展开次数,处理各种循环情况。需要说明的是,前述三种循环中,死循环和符号化循环可以设置最大展开次数默认值设为20和10,当然还可以是50和20等等其它值,普通循环的默认值则为循环本身展开的次数。循环达到设定的上限值不再展开的前提是循环内所有的分支都已经被覆盖过,根据上述的路径搜索策略算法,在代码逻辑正确的情况下这点是可以满足的。在符号执行前,可以根据代码的复杂情况进行相应的调整。
S5:对所有的路径按照路径分支表中已经访问的分支数进行排序;
在本步骤中,在指令分析结束后对所有的路径按照其路径分支表中已经访问的分支数进行排序,遍历排序后的路径,判断路径的当前待分析指令是否已经被访问,选取第一条当前待分析指令没有被访问的路径作为下一条路径。
S6:确认当前路径已覆盖到新的分支,保留当前路径并将当前路径覆盖的分支和测试用例缓存。
本步骤中,路径到达程序结束点,先判断当前路径是否覆盖到了新的分支,如果确认当前路径已覆盖到新的分支,则保留该路径并将其覆盖的分支和测试用例缓存,如果确认当前路径未覆盖到新的分支,丢弃当前路径并跳转至步骤S3。
S7:输出缓存的测试用例数据。
最后,终止所有的路径分析,输出所有缓存好的测试用例数据。
本实施例的符号执行方法,在程序规模较为复杂时,程序中循环的处理问题成为符号执行需要面临的问题,通过采用覆盖率优先的路径搜索策略,对循环进行特殊的处理,使得在符号执行的过程中不至于陷入到某一段代码一直无法跳出导致超时,保证了符号执行的实际可行性。
下面,用一个具体案例对本发明符号执行方法进行说明,具体示例程序如下:
int example(int a)
{
int b = 0;
while (b < 10)
{
...
b++;
}
...
while (a < 10)
{
...
}
...
return 0;
}
S1:遍历待分析程序的所有指令,建立程序分支表,程序分支表会有四个分支信息,包括第一个while的真分支和假分支,第二个while的真分支和假分支。
S2:对待分析程序的程序路径建立路径分支表,在程序开始的时候只有一条路径(以下记为第一条路径),则建立的路径分支表中都没有分支记录。
S3:判断程序分支表所有的分支是否都被访问过,在初次到S3的时候显然程序分支表中的分支信息都没有访问到,在确认程序分支表中的所有分支未被访问,执行S4。
S4:在当前路径下分析指令,收集已访问的分支记录,并将已访问的分支记录更新到路径分支表。具体地,开始分析指令,直到遇到第一个while循环,而由于该循环仅仅是普通循环(因为变量b的值是已经被赋值的,是确定值),则不会发生路径复制,按照处理普通循环的策略,执行到第11次的时候跳出循环,同时路径分支表中已经将其真分支和假分支的状态记录。在遇到第二个while循环时,由于变量a是函数的输入,其实际值可以是任意值,而该循环又受到变量a的影响,所以该循环是符号化的循环,则会产生路径的复制,复制出来的路径(以下记为第二条路径)产生 a >= 10 的约束,使得路径不进入while循环。
S5:此时程序执行到第二个while循环的条件判断出,且总共有两条路径,他们的路径分支表中记录的分支数量一样多,则在路径选择的时候仅仅根据未执行的指令进行判定,由于第二个循环还没有执行过一次,所以会选择第一条路径,在第一条路径再次回到while条件的时候,由于循环已经执行过一次,而第二条路径导向的循环外的指令还未执行过,所以进行路径搜索的时候会选择到第二条路径,而把第一条路径挂起在while条件处,在指令分析结束后,对所有的路径按照路径分支表中已经访问的分支数进行排序。
S6:通过这种策略,第二条路径会先于第一条路径到达程序结束点。而第一条路径中由于加入了 a < 10 这条约束,导致路径陷入死循环,根据死循环的展开次数,在符号执行分析第21次该循环的时候,会强行跳出该循环,让第一条路径继续向下执行直到程序末尾(跳转到S3),在确认当前路径已覆盖到新的分支,保留当前路径并将当前路径覆盖的分支和测试用例缓存,这样,保证分析的正常终止和测试用例的正常生成。
S7:在第一条路径也完成后,两条路径已经将程序分支表中的四条分支信息都标记为已访问状态,此时即使还有其他路径未被执行完,也可以提前终止符号执行,输出缓存的测试用例数据,而此时输出的测试用例覆盖率已经达到了很高的状态,且时间消耗极小。
另一方面,本发明具体实施例提出的一种单元测试方法,采用纯自动化的单元测试方法,用户仅仅需要将待测试程序导入到系统,即可以自动化完成单元测试,大大减少了单元测试的工作量。而且系统的通用性强,不仅仅支持C/C++标准的特性,而且对于某些特定的嵌入式平台上的编译器提供的语言特性也可以支持。如图3所示,该单元测试方法具体包括如下步骤:
S10:获取待测程序。
该步骤用于获取需要进行单元测试的待测程序,获取方式可以通过用户输入、程序导入或直接获取等方式,只要能够满足测试需求即可,获取待测程序过程中或前后,可配置待测程序的宏信息、头文件搜索路径,并确认待测程序的可编译性,确保程序可正常完成编译,所谓的可正常完成编译是指待测程序必须在编译阶段没有语法错误,链接阶段没有符号重名的错误,但是符号未定义的错误是可以接受的。
S20:解析待测程序,提取待测程序的待测函数及待测函数的基础信息,将待测程序编译成中间码。
该步骤中,优选利用开源框架LLVM分析待测程序,将待测程序编译成LLVM中间码,LLVM(Low Level Virtual Machine)为底层虚拟机,是构架编译器的框架系统,以C++编写而成,用于优化以任意程序语言编写的程序的编译时间(compile-time)、链接时间(link-time)、运行时间(run-time)以及空闲时间(idle-time),对开发者保持开放,并兼容已有脚本。借助开源框架LLVM,分析用户的待测程序的源代码级别程序信息,提取程序的待测函数及其基础信息,并且将待测程序的代码编译成定制的LLVM中间码,通过基于LLVM中间码的解释器解释执行,可自动化的完成单元测试。
进一步地,待测函数的基础信息可以包括待测函数的函数名、代码行数统计信息、分支统计信息、圈复杂度、控制流信息中的一个或多个。
S30:根据每个待测函数的基础信息,对待测函数进行代码插桩,生成驱动函数。
插桩是在保证待测程序原有逻辑完整性的基础上在待测程序中插入一些探针(或称为“探测仪”),通过探针的执行并抛出待测程序运行的特征数据,通过对这些数据的分析,可以获得程序的控制流和数据流信息,进而得到逻辑覆盖等动态信息,从而实现测试目的。具体地,对待测函数进行代码插桩,生成驱动函数可以包括:分析LLVM中间码,根据待测函数的函数参数、全局变量和/或局部静态变量进行代码插桩,生成调用待测函数的用适于符号执行的驱动函数,驱动函数作为符号执行引擎的输入,当然,可将每个待测函数生成一个驱动函数进行符号执行;进一步来说,插桩的过程中会通过LLVM IR(中间语言)获取在指令上的附着信息,即metadata信息,通过修改这个附着信息,将待测函数的变量的名称和类型添加到其中,从而标记待测函数的函数参数、全局变量和/或局部静态变量中影响待测函数行为的变量,以作为符号执行引擎自动符号化的依据。
S40:利用上述符号执行方法分析驱动函数,生成用于单元测试待测函数的测试用例。
该步骤中,可以通过符号执行技术分析驱动函数,且每个待测函数都会生成一个驱动函数进行符号执行,从驱动函数开始分析,并将S30步骤中待测函数的函数参数、全局变量和/或局部静态变量中已标记的变量进行符号化,赋予未标记的变量在待测函数中初始化时的真实值,利用符号执行引擎解释执行待测程序,生成一组测试用例,通过该步骤可以生成一组无冗余高覆盖率的测试用例,这组测试用例会包括函数的输入和期望的输出,以及当前函数输入下触发的缺陷。
S50:执行测试用例,反馈单元测试结果。
对S40中生成的一组测试用例数据,可以利用系统内定义的一套函数声明接口,将测试用例数据封装成测试驱动程序,通过在解释器中将这套程序声明作为解释器内嵌函数实现其函数功能,解释执行相应的测试驱动程序,在解释执行的过程中收集执行指令的信息,包括指令的行数、调用指令调用的次数和是否引发缺陷,并导出到输出文件中,这些信息即单元测试的结果。
综上所述,本实施例的单元测试方法,一方面,借助开源框架LLVM,分析用户待测程序的源代码级别程序信息,提取待测程序的待测函数及待测函数相关的基础信息,并且将待测程序的代码编译成定制的LLVM中间码。通过待测函数相关的基础信息和中间码的交互,利用动态符号执行技术,为每个待测函数生成高覆盖率的测试用例,并为每个测试用例封装成测试驱动程序,通过基于LLVM中间码的解释器解释执行每个测试驱动程序,可自动化的完成单元测试。另一方面,由于采用了符号执行时高覆盖率优先的路径搜索算法,能够在单元测试时生成一组高覆盖率,无冗余的测试用例。同时,该路径搜索算法,结合循环的分类处理方式,能对存在死循环的代码也正常生成触发死循环的测试用例。另外,该路径搜索算法能极大的缩短测试用例生成时间,避免大量的无效符号执行。
再一方面,本实施例还提出的电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,处理器执行程序时实现上述一种符号执行方法或单元测试方法的步骤,该电子设备可以是手机、平板、移动电脑等一切能够实现单元测试的电子设备。
最后,本实施例提出的计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现上述一种符号执行方法或单元测试方法的步骤。
由于前述的电子设备及计算机可读存储介质均包含前述的符号执行方法或单元测试方法,因此,也具备该单元测试方法的有益效果,在此不再赘述。
以上仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

Claims (9)

1.一种符号执行方法,其特征在于,包括:
S1:遍历待分析程序的所有指令,建立程序分支表;所述程序分支表用于保存所述待分析程序中所有分支指令到指令指向的程序基本块的映射,并记录各所述程序基本块是否已经通过对应的分支指令访问;
S2:对待分析程序的程序路径建立路径分支表;所述路径分支表用于保存所述待分析程序中各程序路径上分支指令到指令指向的程序基本块的映射,并记录所述程序基本块是否已经通过对应的分支指令访问;
S3:确认程序分支表中的所有分支未被访问,执行S4;
S4:在当前路径下分析指令,收集已访问的分支记录,并将已访问的分支记录更新到路径分支表;
S5:对所有的路径按照路径分支表中已经访问的分支数进行排序;
S6:确认当前路径已覆盖到新的分支,保留当前路径并将当前路径覆盖的分支和测试用例缓存;
S7:输出缓存的测试用例数据。
2.根据权利要求1所述的符号执行方法,其特征在于,所述步骤S3还包括:
确认程序分支表中的所有分支已被访问,执行步骤S7。
3.根据权利要求2所述的符号执行方法,其特征在于,所述步骤S6还包括:
确认当前路径未覆盖到新的分支,丢弃当前路径并跳转至步骤S3。
4.根据权利要求2所述的符号执行方法,其特征在于,所述步骤S5还包括:
遍历排序后的路径,判断路径的当前待分析指令是否已经被访问,选取第一条当前待分析指令没有被访问的路径作为下一条路径。
5.根据权利要求4所述的符号执行方法,其特征在于,所述步骤S4还包括:
将当前指令设置为已访问状态,分析指令时对于分支跳转指令进行处理,所述处理包括识别分支指令是否代表循环、对循环进行分类、对死循环进行剪枝,其中,对循环分类为普通循环,死循环和符号化循环。
6.一种单元测试方法,其特征在于,包括:
S10:获取待测程序;
S20:解析所述待测程序,提取所述待测程序的待测函数及所述待测函数的基础信息,将所述待测程序编译成中间码;
S30:根据每个所述待测函数的基础信息,对所述待测函数进行代码插桩,生成驱动函数;
S40:利用权利要求1-5任一项所述的符号执行方法分析所述驱动函数,生成用于单元测试所述待测函数的测试用例;
S50:执行所述测试用例,反馈单元测试结果。
7.根据权利要求6所述的单元测试方法,其特征在于,所述步骤S20中“将所述待测程序编译成中间码”包括:
利用开源框架LLVM分析所述待测程序,将待测程序编译成LLVM中间码;
所述步骤S30还包括:
分析所述LLVM中间码,根据所述待测函数的函数参数、全局变量和/或局部静态变量进行代码插桩,生成调用所述待测函数的用适于符号执行的驱动函数,所述驱动函数作为符号执行引擎的输入;并将每个所述待测函数生成一个所述驱动函数进行符号执行;
标记所述待测函数的函数参数、全局变量和/或局部静态变量中影响所述待测函数行为的变量,以作为所述符号执行引擎自动符号化的依据。
8.一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,所述处理器执行所述程序时实现权利要求1至5中任一项所述符号执行方法的步骤,或权利要求6或7所述的单元测试方法的步骤。
9.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,该计算机程序被处理器执行时实现权利要求1至5中任一项所述符号执行方法的步骤,或权利要求6或7所述的单元测试方法的步骤。
CN202210169478.1A 2022-02-24 2022-02-24 一种符号执行方法、单元测试方法、电子设备及存储介质 Active CN114238154B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202210169478.1A CN114238154B (zh) 2022-02-24 2022-02-24 一种符号执行方法、单元测试方法、电子设备及存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202210169478.1A CN114238154B (zh) 2022-02-24 2022-02-24 一种符号执行方法、单元测试方法、电子设备及存储介质

Publications (2)

Publication Number Publication Date
CN114238154A CN114238154A (zh) 2022-03-25
CN114238154B true CN114238154B (zh) 2022-05-06

Family

ID=80747940

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202210169478.1A Active CN114238154B (zh) 2022-02-24 2022-02-24 一种符号执行方法、单元测试方法、电子设备及存储介质

Country Status (1)

Country Link
CN (1) CN114238154B (zh)

Families Citing this family (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN114817927B (zh) * 2022-03-30 2024-01-09 北京邮电大学 基于分支覆盖指导的有效符号执行方法
CN115576854B (zh) * 2022-11-25 2023-03-28 微科智检(佛山市)科技有限公司 一种安卓自动化单元测试方法

Citations (10)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103116540A (zh) * 2013-01-23 2013-05-22 电子科技大学 基于全局超级块支配图的动态符号执行方法及其装置
CN104503901A (zh) * 2014-12-04 2015-04-08 中国人民解放军总参谋部第五十四研究所 一种基于静态路径分析的导向符号执行方法
CN106022350A (zh) * 2015-03-30 2016-10-12 尼尔森(美国)有限公司 用于改进决策树执行的方法和设备
CN106502912A (zh) * 2016-10-31 2017-03-15 电子科技大学 用于漏洞发掘的动态符号执行可视化方法
CN108710575A (zh) * 2018-05-23 2018-10-26 华南理工大学 基于路径覆盖测试用例自动生成的单元测试方法
CN110515856A (zh) * 2019-09-02 2019-11-29 华东师范大学 一种基于动态符号执行的测试用例生成系统
CN111367786A (zh) * 2018-12-26 2020-07-03 华为技术有限公司 一种符号执行方法、电子设备以及存储介质
CN111400165A (zh) * 2020-02-11 2020-07-10 中国人民解放军战略支援部队信息工程大学 一种基于前向探针的离线符号执行路径搜索方法
CN112231225A (zh) * 2020-10-30 2021-01-15 中国人民解放军国防科技大学 一种基于数组信息引导的符号执行优化方法及装置
CN114036072A (zh) * 2022-01-06 2022-02-11 湖南泛联新安信息科技有限公司 一种支持自动化检测程序缺陷的方法和系统

Family Cites Families (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN104732152B (zh) * 2015-04-07 2017-11-24 南京大学 基于符号执行路径剪枝的缓冲区溢出漏洞自动检测方法
US10635576B2 (en) * 2018-06-18 2020-04-28 Fujitsu Limited Branch coverage guided symbolic execution for hybrid fuzz testing of software binaries
CN108845944B (zh) * 2018-06-28 2021-10-15 中国人民解放军国防科技大学 一种结合符号执行提高软件模糊测试效率的方法
CN110515857A (zh) * 2019-09-02 2019-11-29 华东师范大学 一种基于动态符号执行的测试用例生成方法

Patent Citations (10)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103116540A (zh) * 2013-01-23 2013-05-22 电子科技大学 基于全局超级块支配图的动态符号执行方法及其装置
CN104503901A (zh) * 2014-12-04 2015-04-08 中国人民解放军总参谋部第五十四研究所 一种基于静态路径分析的导向符号执行方法
CN106022350A (zh) * 2015-03-30 2016-10-12 尼尔森(美国)有限公司 用于改进决策树执行的方法和设备
CN106502912A (zh) * 2016-10-31 2017-03-15 电子科技大学 用于漏洞发掘的动态符号执行可视化方法
CN108710575A (zh) * 2018-05-23 2018-10-26 华南理工大学 基于路径覆盖测试用例自动生成的单元测试方法
CN111367786A (zh) * 2018-12-26 2020-07-03 华为技术有限公司 一种符号执行方法、电子设备以及存储介质
CN110515856A (zh) * 2019-09-02 2019-11-29 华东师范大学 一种基于动态符号执行的测试用例生成系统
CN111400165A (zh) * 2020-02-11 2020-07-10 中国人民解放军战略支援部队信息工程大学 一种基于前向探针的离线符号执行路径搜索方法
CN112231225A (zh) * 2020-10-30 2021-01-15 中国人民解放军国防科技大学 一种基于数组信息引导的符号执行优化方法及装置
CN114036072A (zh) * 2022-01-06 2022-02-11 湖南泛联新安信息科技有限公司 一种支持自动化检测程序缺陷的方法和系统

Non-Patent Citations (5)

* Cited by examiner, † Cited by third party
Title
Day92-94:阅读LLVM官方文档;佚名;《https://github.com/Vancir/365-days-get-xuanwulab-job/blob/master/weeks/week14.md》;20201128;全文 *
Symbolic execution with SymCC:Don"t intepret,compile!;Senastian Poeplau等;《The proceedings of the 29th USENIX Security Symposium》;20200814;全文 *
一种基于程序功能标签切片的制导符号执行分析方法;甘水滔等;《软件学报》;20191130;第30卷(第11期);全文 *
基于覆盖准则的软件测试用例自动化生成方法的研究与实现;苏亭;《中国博士学位论文全文数据库 基于覆盖准则的软件测试用例自动化生成方法的研究与实现》;20160815(第8期);全文 *
符号化验证关键技术研究;于恒彪;《中国博士学位论文全文数据库 信息科技辑》;20210115(第1期);全文 *

Also Published As

Publication number Publication date
CN114238154A (zh) 2022-03-25

Similar Documents

Publication Publication Date Title
CN109739755B (zh) 一种基于程序追踪和混合执行的模糊测试系统
CN114238154B (zh) 一种符号执行方法、单元测试方法、电子设备及存储介质
US9535823B2 (en) Method and apparatus for detecting software bugs
US7681180B2 (en) Parameterized test driven development
US6986125B2 (en) Method and apparatus for testing and evaluating a software component using an abstraction matrix
US6067639A (en) Method for integrating automated software testing with software development
CN110046089B (zh) 一种基于路径覆盖充分性准则的智能合约测试方法
Arcuri et al. Private api access and functional mocking in automated unit test generation
US20020091968A1 (en) Object-oriented data driven software GUI automated test harness
US7895575B2 (en) Apparatus and method for generating test driver
CN108459954B (zh) 应用程序漏洞检测方法和装置
CN111428431A (zh) 一种支持eda软件的自动化测试并记录的方法及系统
CN106529304B (zh) 一种安卓应用并发漏洞检测系统
CN110865941A (zh) 接口测试用例生成方法、装置和系统
CN114036072B (zh) 一种支持自动化检测程序缺陷的方法和系统
Ma et al. GRT at the SBST 2015 tool competition
CN110633199A (zh) 用于支持智能合约的区块链的测试装置、方法及介质
CN114281709A (zh) 一种单元测试方法、系统、电子设备及存储介质
US10452534B2 (en) Asynchronous operation query
CN115310095A (zh) 一种区块链智能合约混合形式化验证方法及系统
CN115098355A (zh) 基于历史数据驱动的jvm测试程序生成方法
CN116501596A (zh) 应用程序的测试方法及装置
US7546589B2 (en) Semi-automated desk checking system and method
WO2021104027A1 (zh) 代码性能检测方法、装置、设备及存储介质
CN112231225A (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
GR01 Patent grant
GR01 Patent grant