CN116383070A - 一种面向高mc/dc的符号执行方法 - Google Patents

一种面向高mc/dc的符号执行方法 Download PDF

Info

Publication number
CN116383070A
CN116383070A CN202310366027.1A CN202310366027A CN116383070A CN 116383070 A CN116383070 A CN 116383070A CN 202310366027 A CN202310366027 A CN 202310366027A CN 116383070 A CN116383070 A CN 116383070A
Authority
CN
China
Prior art keywords
branch
sequence
path
statement
jumping
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.)
Granted
Application number
CN202310366027.1A
Other languages
English (en)
Other versions
CN116383070B (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.)
Nanjing University of Aeronautics and Astronautics
Original Assignee
Nanjing University of Aeronautics and Astronautics
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 Nanjing University of Aeronautics and Astronautics filed Critical Nanjing University of Aeronautics and Astronautics
Priority to CN202310366027.1A priority Critical patent/CN116383070B/zh
Publication of CN116383070A publication Critical patent/CN116383070A/zh
Application granted granted Critical
Publication of CN116383070B publication Critical patent/CN116383070B/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/3668Software testing
    • G06F11/3672Test management
    • G06F11/3676Test management for coverage analysis
    • YGENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y02TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
    • Y02DCLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
    • Y02D10/00Energy efficient computing, e.g. low power processors, power management or thermal management

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)
  • Devices For Executing Special Programs (AREA)

Abstract

本发明公开了一种面向高MC/DC的符号执行方法,通过获取Java程序的程序依赖关系,提取方法所需的分支依赖关系生成“result.txt”文件;根据分支依赖关系和分支语句当前的MC/DC分数进行路径选择,采用深度优先搜索算法遍历Java程序的路径;每当进行路径探索时,记录各个分支语句的短路位置,对应的操作数栈和Java字节码等等;探索路径结束后,对短路位置进行赋值,并进行路径筛选;针对需要进行路径约束求解的路径,将分支语句上的短路位置转化为相应的约束表达式再进行路径约束求解,生成测试用例,并更新分支语句的相关信息;直至所有路径遍历结束,或Java程序中所有分支语句的MC/DC分数达到100%,则结束执行,输出所生成的测试用例,以此实现一种面向高MC/DC的符号执行方法。

Description

一种面向高MC/DC的符号执行方法
技术领域
本发明属于软件工程技术领域,具体涉及一种面向高MC/DC的符号执行方法。
背景技术
众所周知,软件测试是保证软件质量和可靠性的重要手段。软件测试是软件生命周期的一个重要组成部分,贯穿了整个软件开发过程,同时,它需要耗费大量的人力、物力和时间,它的成本大约占了整个软件开发成本的百分之四十到五十。因此,保证软件开发质量、降低软件开发成本的重要手段之一是提高软件测试的自动化程度。
MC/DC是NASA在DO-178C标准提出的安全关键系统的最优代码覆盖度量标准,可用于测量测试集的充分性。MC/DC是一种非常苛刻的覆盖形式,是一个白盒测试标准,其思想是通过证明每个条件都可以独立影响判定结果来测试判定表达式,它表明已经执行了足够的测试以确保正确操作。MC/DC准则可以帮助测试人员检测到更多的错误,但也会显著地增加测试成本,高达其他开发任务成本的七倍。由于MC/DC标准的要求很复杂,需要使用一对测试用例来分别覆盖每个条件,并且系统测试人员手动构建合适的测试集并不容易,同时,想要实现高MC/DC覆盖率,测试人员需要手动进行复杂的控制流分析以生成测试的输入值,这是非常困难的。
目前,通过符号执行技术来生成MC/DC测试用例的工具大多数都是通过贪心算法、边界值分析法或代码转换来实现的,若通过贪心算法生成MC/DC测试用例,可能会存在路径约束冲突问题,使其MC/DC无法得到有效改进,甚至会陷入死循环;若通过边界值分析法生成MC/DC测试用例,则不会考虑程序内部结构,可能无法达到最高的MC/DC覆盖率;若通过代码转换生成MC/DC测试用例,则会增加路径数量,使其效率降低。因此,如何自动生成测试用例以实现高MC/DC覆盖率,降低测试成本已成为软件开发过程中不可避免的问题。
发明内容
发明目的:为解决在软件工程技术领域如何自动生成MC/DC测试用例的问题,本发明提出了一种面向高MC/DC的符号执行方法,减少手动分析控制流的测试成本,生成满足MC/DC准则的测试用例,提高软件系统的测试效率。
技术方案:一种面向高MC/DC的符号执行方法,包括以下步骤:
步骤1:获取待测Java程序的程序依赖关系,根据程序依赖关系提取分支依赖关系,并生成“result.txt”文件;其中,所述程序依赖关系包括控制依赖和数据依赖;
步骤2:根据步骤1获取的分支依赖关系和分支语句当前的MC/DC分数进行路径选择后,采用深度优先搜索算法进行路径探索,执行步骤3;
步骤3:对步骤2探索的路径上所有到达的分支语句,获取它们的布尔表达式,以及布尔表达式中各个条件的真值、对应的操作数栈和Java字节码,并根据条件的真值构造各分支语句的执行序列,同时判断各分支语句是否有能使布尔表达式中所有条件都具备独立影响作用的初始MC/DC序列,若没有则构造初始MC/DC序列;执行步骤4;
步骤4:判断步骤2探索的路径上所有分支语句是否存在短路位置,若分支语句存在短路位置,则根据该分支语句的初始MC/DC序列对短路位置进行赋值;执行步骤5;
步骤5:根据步骤2探索的路径上所有分支语句的执行序列,判断是否需要对该路径进行约束求解;若需要进行约束求解,则执行步骤6,否则跳转至步骤2重新进行路径选择;
步骤6:若该路径上任意分支语句存在短路位置,则将该分支语句上的短路位置转化为约束条件,加入到路径约束中,再进行约束求解,生成测试用例,执行步骤7;否则,直接进行约束求解,生成测试用例,执行步骤7;
步骤7:更新步骤2探索的路径上各个分支语句的已执行序列和MC/DC分数,执行步骤8;
步骤8:判断是否完成所有路径的路径探索,若是则符号执行完成,输出所生成的测试用例;若否,则判断待测Java程序中所有分支语句的MC/DC分数是否都达到100%,若都达到100%,则符号执行完成,输出所生成的测试用例,否则跳转至步骤2重新进行路径选择。
进一步地:该方法还包括在所述步骤1之前对待测的Java程序进行如下预处理:对待测的Java程序中的分支语句进行检查,若分支语句的布尔表达式存在函数,则将函数提取出来并用一个变量表示该函数,然后对布尔表达式进行修改。
进一步地:步骤2中所述的分支依赖关系包括分支潜在依赖和分支交互依赖,其具体含义如下:
a)分支潜在依赖:对于一对分支语句<bri,brj>,若存在非分支语句nk不为分支,使<nk,brj>存在数据依赖,<bri,nk>存在控制依赖,同时,<bri,brj>不存在控制依赖,则认为<bri,brj>存在分支潜在依赖;
b)分支交互依赖:对于一对分支语句<bri,brj>,若bri和brj的布尔表达式中含有相同的变量,则认为<bri,brj>存在分支交互依赖。
进一步地:步骤2中,所述的根据分支依赖关系和分支语句当前的MC/DC分数进行路径选择,具体包括:
S210:判断分支语句的MC/DC分数是否达到100%,若达到100%,则跳转至S220;若未达到100%,则跳转至S240;
S220:判断位于该分支语句之后,并与该分支语句存在分支交互依赖的分支语句的MC/DC分数是否都达到100%,若都达到100%,则跳转至S230;若未都达到100%,则跳转至S240;
S230:判断与该分支语句存在分支潜在依赖的分支语句的MC/DC分数是否都达到100%,若都达到100%,则回溯到上一个分支语句,并返回S210;若未都达到100%,则跳转至S240;
S240:开始进行路径探索。
进一步地:步骤3中,所述执行序列由字符“0”、“1”和“2”组成,“0”代表对应条件的真值为true,“1”代表对应条件的真值为false,“2”代表对应条件为短路位置。
进一步地:步骤3中,所述构造初始MC/DC序列,具体包括:
S310:初始化初始MC/DC序列为空;
S320:将该分支语句的执行序列加入到该分支语句的初始MC/DC序列中;
S330:判断初始MC/DC序列中是否有新序列加入,若有,则从初始MC/DC序列中取出该新序列,并跳转至S340;若没有,则跳转至S360;
S340:在当前初始MC/DC序列中,获得该分支语句的布尔表达式中未具备独立影响作用的条件,计算得到该分支语句的布尔表达式在S230取出的新序列下的真值,依次将在该新序列下条件结果与布尔表达式结果相同的条件取出,并对条件真值进行取反再次获得新序列,判断该布尔表达式在再次获得的新序列下的结果与在S230取出的新序列下的真值是否相反,若相反,则将再次获得的新序列加入到当前初始MC/DC序列中,否则,再次获得的新序列不加入到当前初始MC/DC序列中;
S350:判断在该分支语句的初始MC/DC序列中,所有的条件是否都具备独立影响的作用,若所有条件都具备独立影响的作用,则跳转至S360;若没有,则跳转至S330;
S360:初始化MC/DC序列结束。
进一步地:步骤4中,所述根据该分支语句的初始MC/DC序列对短路位置进行赋值,具体包括:
S410:根据该分支语句的执行序列构造正则表达式:遍历该分支语句的执行序列,若遍历到的字符为“0”或“1”,则将该字符加入到正则表达式中;若遍历到的字符为“2”,则将“[0-1]”加入到正则表达式中;
S420:在该分支语句的初始MC/DC序列中,查找是否有匹配S510构造的正则表达式的序列,若有,则对短路位置赋于该序列上相同位置的值,并跳转至S440;若没有,则跳转至S430;
S430:若短路位置前的逻辑运算符为&&,则对短路位置赋为1;若短路位置前的逻辑运算符为||,则对短路位置赋为0;
S440:对分支语句的短路位置赋值结束。
进一步地:步骤5中,根据步骤2探索的路径上所有分支语句的执行序列,判断是否对该条路径进行约束求解,具体包括:
S510:判断该路径上是否存在分支语句的布尔表达式中有条件的Java字节码未获取的情况,若存在,则将该路径上各个分支语句的操作数栈和该路径的路径约束都存储起来,下一次再进行约束求解,并跳转至步骤2;若不存在,则跳转至S520;
S520:判断该路径中各个分支语句的执行序列是否在分支语句对应的已执行序列中,若都在已执行序列中,则不需要在进行约束求解,跳转至步骤2;若没有,则跳转至S530;
S530:进行约束求解。
进一步地:步骤7中,所述的更新路径上各个分支语句的已执行序列和MC/DC分数,具体包括:
S710:判断该路径上的各个分支语句的执行序列是否在分支语句对应的已执行序列中,若已经存在,则跳转至S730;若不存在,则将该执行序列加入到已执行序列中,执行S720;
S720:判断该执行序列是否能与已执行序列构成独立对,也就是说,是否能使布尔表达式中的条件具有独立影响的作用,若能构成独立对,则记录具有独立影响作用的条件,并更新该分支语句的MC/DC分数;
S730:更新各个分支语句的已执行序列和MC/DC分数结束。
进一步地:MC/DC分数计算公式如下:
MC/DC分数=已具备独立影响作用的条件数量/条件总数。
进一步地:所述“result.txt”文件中,第一行和第二行分别表示在待测Java程序中分支语句出现的变量名称以及含有该变量的分支语句对应的行数,第三行和第四行表示在待测Java程序中分支语句的行数以及与该分支语句存在分支交互依赖的分支语句的行数;对于存在分支潜在依赖的<bri,brj>,第五行和第六行表示bri和对应的brj集合,第七行和第八行表示brj和对应的bri集合。
有益效果:本发明通过获取Java程序的程序依赖关系,提取方法所需的分支依赖关系生成“result.txt”文件;采用深度优先搜索算法遍历Java程序的路径,并根据分支依赖关系和分支语句当前的MC/DC分数进行路径选择;每当进行路径探索时,记录各个分支语句的短路位置(即不执行的条件),对应的操作数栈和Java字节码等等;探索路径结束后,对短路位置进行赋值,并进行路径筛选;针对需要进行路径约束求解的路径,将分支语句上的短路位置转化为相应的约束表达式再进行路径约束求解,生成测试用例,并更新分支语句的相关信息;直至所有路径遍历结束,或Java程序中所有分支语句的MC/DC分数达到100%,则结束执行,输出所生成的测试用例,以此实现一种面向高MC/DC的符号执行方法,减少手动分析控制流的测试成本,生成满足MC/DC准则的测试用例,提高软件系统的测试效率。
附图说明
图1为一种面向高MC/DC的符号执行方法的流程图。
具体实施方式
下面结合附图对本发明的技术方案作进一步说明。
参照图1,本发明提出的一种面向高MC/DC的符号执行方法,主要分为程序预处理、分支依赖关系生成和符号执行三个部分。首先,为了更好的提取Java程序中分支语句里条件对应的Java字节码,先对待测的Java程序进行预处理。其次,通过获取Java程序的程序依赖关系,提取方法所需的分支依赖关系,即分支潜在依赖和分支交互依赖,并生成“result.txt”文件。最后,采用深度优先搜索算法遍历Java程序的路径,并根据分支依赖关系和分支语句当前的MC/DC分数进行路径选择;每当进行路径探索时,记录各个分支语句的短路位置,对应的操作数栈和Java字节码等等;探索路径结束后,对短路位置进行赋值,并进行路径筛选;针对需要进行路径约束求解的路径,将分支语句上的短路位置转化为相应的约束表达式再进行路径约束求解,生成测试用例,并更新分支语句的相关信息;直至所有路径遍历结束,或Java程序中所有分支语句的MC/DC分数达到100%,则结束执行,输出所生成的测试用例。具体步骤如下:
步骤1:对待测的Java程序进行预处理。
对待测的Java程序中的分支语句进行检查,判断分支语句中是否存在函数,若存在函数,则将函数提取出来并用一个变量表示该函数,然后对布尔表达式进行修改,得到处理后的Java程序。例如:对于分支语句If(fun()>0),fun()为函数,因此将其更改为intfunRes=fun();if(funRes>0)。
步骤2:获取预处理后Java程序的分支依赖关系,并生成“result.txt”文件。
首先,通过Indus工具获得Java程序中的控制依赖和数据依赖。其次,通过对比各个分支语句的布尔表达式中所包含的变量,若两个分支语句的布尔表达式含有相同的变量,则加入到对应的分支交互依赖的分支语句集合中。然后,对存在数据依赖关系的非分支语句nk与分支语句brj进行分析,判断是否存在一个分支语句bri与非分支语句nk存在控制依赖关系,但不与分支语句brj存在控制依赖关系,若存在,则将两个分支语句bri和brj加到对应的分支潜在依赖的分支语句集合中。最后,将具有分支潜在依赖和分支交互依赖的分支语句集合信息写入到“result.txt”文件中。
具体地,分支潜在依赖和分支交互依赖,其具体含义如下:
c)分支潜在依赖:对于一对分支语句<bri,brj>,若存在非分支语句nk不为分支,使<nk,brj>存在数据依赖,<bri,nk>存在控制依赖,同时,<bri,brj>不存在控制依赖,则认为<bri,brj>存在分支潜在依赖;
分支交互依赖:对于一对分支语句<bri,brj>,若bri和brj的布尔表达式中含有相同的变量,则认为<bri,brj>存在分支交互依赖。
在“result.txt”文件中,第一行和第二行分别表示在程序中分支语句出现的变量名称以及含有该变量的分支语句对应的行数,第三行和第四行表示在程序中分支语句的行数以及与该分支语句存在分支交互依赖的分支语句的行数;对于存在分支潜在依赖的<bri,brj>,第五行和第六行表示bri和对应的brj集合,第七行和第八行表示brj和对应的bri集合。
步骤3:根据步骤2获取的分支依赖关系和分支语句当前的MC/DC分数进行路径选择(即选择从哪一个分支语句开始探索路径),采用深度优先搜索算法遍历Java程序的路径,。
将步骤2生成的“result.txt”文件放入到“jpf-symbc/src/file”中,并运行待测Java程序的“.jpf”文件。现对根据分支依赖关系和分支语句当前的MC/DC分数进行路径选择的具体步骤说明如下。
S310:判断该分支语句的MC/DC分数是否达到100%,若达到100%,则跳转至S320;若未达到100%,则跳转至S340;
S320:判断位于其后面的分支语句中,与其存在分支交互依赖关系的分支语句MC/DC分数是否达到100%,若达到100%,则跳转至S330,若未达到100%,则跳转至S340;
S330:判断与其存在分支潜在依赖关系的分支语句MC/DC分数是否达到100%,若达到100%,则认为从该分支语句探索新路径,对提高Java程序的MC/DC覆盖率没有帮助,因此回溯到上一个分支语句,并跳转至S310重复以上步骤;若未达到100%,则跳转至S340;
S340:开始探索新的路径。
步骤4:路径探索。
在进行路径探索时,若初次到达该分支语句,则为该分支语句创建一个对象,该对象主要包含布尔表达式sourceCode(还可以根据实际对布尔表达式进行简化,形成简化后的表达式simpCode)、、布尔表达式中条件的集合conList、判定结果result、操作数栈attrs、条件对应的Java字节码集合prevInstList、条件两边对应的变量集合sym_v1List和sym_v2List、当前执行的序列currentConStr、对短路位置赋值后的序列changeConStr、判定结果为true的已执行序列集合trueSeqList、判定结果为false的已执行序列集合falseSeqList、记录独立对的集合pairList、初始MC/DC序列MCDCSeqList、初始MC/DC序列对应的判定结果MCDCResList、MC/DC分数score以及判断分支语句是否解析完成的标志analysisFlag等信息。同时,根据该分支语句的布尔表达式sourceCode,进行简化获得simpCode,并对布尔表达式进行分析、获得判定表达式中的条件并加入到集合conList中。
每次执行到该分支语句的条件分支指令,则根据该条件的取值进行构造序列currentConStr,序列由“0”、“1”和“2”组成,若该条件为true则用“1”表示,若为false则用“0”表示,若为短路位置则用“2”表示;并根据该序列的最后一个取值(1或0)来确定该判定表达式的判定结果result。同时,将该条件对应的加载指令存入prevInstList中,将条件两边的变量分别加入到sym_v1List和sym_v2List中。若分支语句中每个条件对应的Java字节码都已提取,则analysisFlag为true。
接下来,判断该分支语句是否有能使所有条件都具备独立影响作用的初始MC/DC序列(其实际为序列的集合),若没有则进行初始化MC/DC序列。现对进行初始化MC/DC序列的具体步骤说明如下。
S410:判断该分支语句是否有能使所有条件都具备独立影响作用的初始MC/DC序列,若没有,则跳转至S420;若有,则跳转至S460;
S420:将执行的序列currentConStr和判定结果result分别加入到该分支语句的初始MC/DC序列MCDCSeqList和初始MC/DC序列对应的判定结果MCDCResList中;
S430:判断初始MC/DC序列MCDCSeqList中是否有新序列加入,若有,则从初始MC/DC序列MCDCSeqList中取出该新序列,并跳转至S440;若没有,则跳转至S460;
S440:在该分支语句的初始MC/DC序列MCDCSeqList中,获得该分支语句的布尔表达式中未具备独立影响作用的条件,计算得到该分支语句的布尔表达式在S430取出的新序列下的真值,依次将在该新序列下条件结果与布尔表达式结果相同的条件取出,并对条件真值进行取反再次获得新序列,判断该布尔表达式在再次获得的新序列下的结果与在S230取出的新序列下的真值是否相反,若相反,则将再次获得的新序列以及对应的判定结果分别加入到MCDCSeqList和MCDCResList中,否则,不加入;
S450:判断在该分支语句的初始MC/DC序列MCDCSeqList中,所有的条件是否都具备独立影响的作用,若所有条件都具备独立影响的作用,则跳转至S460;若没有,则跳转至S430;
S460:初始化MC/DC序列结束。
步骤5:若该路径上的分支语句存在短路位置,则对短路位置进行赋值。
探索路径结束后,依次遍历路径上的分支语句,判断该路径上的分支语句是否存在短路位置,若有分支语句存在短路位置,则根据该分支语句的初始MC/DC序列对短路位置进行赋值。现对短路位置进行赋值的具体步骤说明如下。
S510:根据该分支语句执行的序列currentConStr,构造正则表达式,如对于简化后的表达式(a&&b),当执行的序列为“02”时,正则表达式为“0[0-1]”;
S520:在该分支语句的初始MC/DC序列MCDCSeqList中,查找是否有符合该正则表达式的序列,若有,则对短路位置赋于该序列上相同位置的值,并跳转至S540;
S530:根据该分支语句简化后的表达式simpCode对短路位置进行赋值,若短路位置前的逻辑运算符为&&,则对短路位置赋为1,若短路位置前的逻辑运算符为||,则对短路位置赋为0;
S540:对分支语句的短路位置赋值结束。
步骤6:路径筛选。
对路径上具有短路位置的分支语句进行赋值后,首先判断该路径中是否存在analysisFlag为false的分支语句,若存在analysisFlag为false的分支语句,则将该条路径的相关信息都加入到unhandledPathList中,下一次在进行求解,并开始探索新的路径;若不存在analysisFlag为false的分支语句,则继续判断该路径中所有分支语句的序列是否都已执行过,若都执行过,则不需要在进行路径约束求解,开始探索新的路径;若没有,则进行路径约束求解。
步骤7:路径约束求解。
针对需要进行路径约束求解的路径,若路径的分支语句上存在短路位置,则在该分支语句的Java字节码集合prevInstList中查找该位置对应的Java字节码,根据Java字节码从操作数栈attrs中提取变量,并分别加入到sym_v1List和sym_v2List中。之后,在判定表达式中条件的集合conList中查找该短路位置对应的条件,并从sym_v1List和sym_v2List中将对应的变量提取出来,最后,将其转化为约束表达式再进行路径约束求解,生成测试用例。然后,判断unhandledPathList是否为空,若非空,则对这些路径继续进行步骤6的路径筛选。
步骤8:更新路径上各个分支语句的已执行序列和MC/DC分数。
在路径进行路径约束求解,生成测试用例后,更新各个分支语句的相关信息。首先,判断该路径上的分支语句的序列是否已执行过,若未执行过,则根据该序列的判定结果将其加入到对应的已执行序列(trueSeqList或falseSeqList)中;其次,判断该序列是否能与已执行序列构成独立对,即是否能使条件具有独立影响的作用,若能构成独立对,则将构成独立对的序列在trueSeqList和falseSeqList中的索引加入到独立对集合pairList中,并通过公式“MC/DC分数=已具备独立影响作用的条件数量/条件总数”来计算MC/DC分数score。
步骤9:若所有路径都遍历过,则结束执行,输出所生成的测试用例;若没有,则判断Java程序中所有分支语句的MC/DC分数score是否都达到100%,若都达到100%,则结束执行,输出所生成的测试用例;若未达到100%,则继续遍历路径。
以上所述实施例仅表达了本申请的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本申请构思的前提下,还可以做出若干变形和改进,这些都属于本申请的保护范围。因此,本申请专利的保护范围应以所附权利要求为准。

Claims (10)

1.一种面向高MC/DC的符号执行方法,其特征在于:包括以下步骤:
步骤1:获取待测Java程序的程序依赖关系,根据程序依赖关系提取分支依赖关系,并生成“result.txt”文件;其中,所述程序依赖关系包括控制依赖和数据依赖;
步骤2:根据步骤1获取的分支依赖关系和分支语句当前的MC/DC分数进行路径选择后,采用深度优先搜索算法进行路径探索,执行步骤3;
步骤3:对步骤2探索的路径上所有到达的分支语句,获取它们的布尔表达式,以及布尔表达式中各个条件的真值、对应的操作数栈和Java字节码,并根据条件的真值构造各分支语句的执行序列,同时判断各分支语句是否有能使布尔表达式中所有条件都具备独立影响作用的初始MC/DC序列,若没有则构造初始MC/DC序列;执行步骤4;
步骤4:判断步骤2探索的路径上所有分支语句是否存在短路位置,若分支语句存在短路位置,则根据该分支语句的初始MC/DC序列对短路位置进行赋值;执行步骤5;
步骤5:根据步骤2探索的路径上所有分支语句的执行序列,判断是否需要对该路径进行约束求解;若需要进行约束求解,则执行步骤6,否则跳转至步骤2重新进行路径选择;
步骤6:若该路径上任意分支语句存在短路位置,则将该分支语句上的短路位置转化为约束条件,加入到路径约束中,再进行约束求解,生成测试用例,执行步骤7;否则,直接进行约束求解,生成测试用例,执行步骤7;
步骤7:更新步骤2探索的路径上各个分支语句的已执行序列和MC/DC分数,执行步骤8;
步骤8:判断是否完成所有路径的路径探索,若是则符号执行完成,输出所生成的测试用例;若否,则判断待测Java程序中所有分支语句的MC/DC分数是否都达到100%,若都达到100%,则符号执行完成,输出所生成的测试用例,否则跳转至步骤2重新进行路径选择。
2.根据权利要求1所述的一种面向高MC/DC的符号执行方法,其特征在于:该方法还包括在所述步骤1之前对待测的Java程序进行如下预处理:对待测的Java程序中的分支语句进行检查,若分支语句的布尔表达式存在函数,则将函数提取出来并用一个变量表示该函数,然后对布尔表达式进行修改。
3.根据权利要求1所述的一种面向高MC/DC的符号执行方法,其特征在于:步骤2中所述的分支依赖关系包括分支潜在依赖和分支交互依赖,其具体含义如下:
a)分支潜在依赖:对于一对分支语句<bri,brj>,若存在非分支语句nk不为分支,使<nk,brj>存在数据依赖,<bri,nk>存在控制依赖,同时,<bri,brj>不存在控制依赖,则认为<bri,brj>存在分支潜在依赖;
b)分支交互依赖:对于一对分支语句<bri,brj>,若bri和brj的布尔表达式中含有相同的变量,则认为<bri,brj>存在分支交互依赖。
4.根据权利要求1所述的一种面向高MC/DC的符号执行方法,其特征在于:步骤2中,所述的根据分支依赖关系和分支语句当前的MC/DC分数进行路径选择,具体包括:
S210:判断分支语句的MC/DC分数是否达到100%,若达到100%,则跳转至S220;若未达到100%,则跳转至S240;
S220:判断位于该分支语句之后,并与该分支语句存在分支交互依赖的分支语句的MC/DC分数是否都达到100%,若都达到100%,则跳转至S230;若未都达到100%,则跳转至S240;
S230:判断与该分支语句存在分支潜在依赖的分支语句的MC/DC分数是否都达到100%,若都达到100%,则回溯到上一个分支语句,并返回S210;若未都达到100%,则跳转至S240;
S240:开始进行路径探索。
5.根据权利要求1所述的一种面向高MC/DC的符号执行方法,其特征在于:步骤3中,所述执行序列由字符“0”、“1”和“2”组成,“0”代表对应条件的真值为true,“1”代表对应条件的真值为false,“2”代表对应条件为短路位置。
6.根据权利要求1所述的一种面向高MC/DC的符号执行方法,其特征在于:步骤3中,所述构造初始MC/DC序列,具体包括:
S310:初始化初始MC/DC序列为空;
S320:将该分支语句的执行序列加入到该分支语句的初始MC/DC序列中;
S330:判断初始MC/DC序列中是否有新序列加入,若有,则从初始MC/DC序列中取出该新序列,并跳转至S340;若没有,则跳转至S360;
S340:在当前初始MC/DC序列中,获得该分支语句的布尔表达式中未具备独立影响作用的条件,计算得到该分支语句的布尔表达式在S230取出的新序列下的真值,依次将在该新序列下条件结果与布尔表达式结果相同的条件取出,并对条件真值进行取反再次获得新序列,判断该布尔表达式在再次获得的新序列下的结果与在S230取出的新序列下的真值是否相反,若相反,则将再次获得的新序列加入到当前初始MC/DC序列中,否则,再次获得的新序列不加入到当前初始MC/DC序列中;
S350:判断在该分支语句的初始MC/DC序列中,所有的条件是否都具备独立影响的作用,若所有条件都具备独立影响的作用,则跳转至S360;若没有,则跳转至S330;
S360:初始化MC/DC序列结束。
7.根据权利要求5所述的一种面向高MC/DC的符号执行方法,其特征在于:步骤4中,所述根据该分支语句的初始MC/DC序列对短路位置进行赋值,具体包括:
S410:根据该分支语句的执行序列构造正则表达式:遍历该分支语句的执行序列,若遍历到的字符为“0”或“1”,则将该字符加入到正则表达式中;若遍历到的字符为“2”,则将“[0-1]”加入到正则表达式中;
S420:在该分支语句的初始MC/DC序列中,查找是否有匹配S510构造的正则表达式的序列,若有,则对短路位置赋于该序列上相同位置的值,并跳转至S440;若没有,则跳转至S430;
S430:若短路位置前的逻辑运算符为&&,则对短路位置赋为1;若短路位置前的逻辑运算符为||,则对短路位置赋为0;
S440:对分支语句的短路位置赋值结束。
8.根据权利要求1所述的一种面向高MC/DC的符号执行方法,其特征在于:步骤5中,根据步骤2探索的路径上所有分支语句的执行序列,判断是否对该条路径进行约束求解,具体包括:
S510:判断该路径上是否存在分支语句的布尔表达式中有条件的Java字节码未获取的情况,若存在,则将该路径上各个分支语句的操作数栈和该路径的路径约束都存储起来,下一次再进行约束求解,并跳转至步骤2;若不存在,则跳转至S520;
S520:判断该路径中各个分支语句的执行序列是否在分支语句对应的已执行序列中,若都在已执行序列中,则不需要在进行约束求解,跳转至步骤2;若没有,则跳转至S530;
S530:进行约束求解。
9.根据权利要求1所述的一种面向高MC/DC的符号执行方法,其特征在于:步骤7中,所述的更新路径上各个分支语句的已执行序列和MC/DC分数,具体包括:
S710:判断该路径上的各个分支语句的执行序列是否在分支语句对应的已执行序列中,若已经存在,则跳转至S730;若不存在,则将该执行序列加入到已执行序列中,执行S720;
S720:判断该执行序列是否能与已执行序列构成独立对,也就是说,是否能使布尔表达式中的条件具有独立影响的作用,若能构成独立对,则记录具有独立影响作用的条件,并更新该分支语句的MC/DC分数,执行S730;其中MC/DC分数计算公式如下:
MC/DC分数=已具备独立影响作用的条件数量/条件总数;
S730:更新各个分支语句的已执行序列和MC/DC分数结束。
10.根据权利要求3所述的一种面向高MC/DC的符号执行方法,其特征在于:所述“result.txt”文件中,第一行和第二行分别表示在待测Java程序中分支语句出现的变量名称以及含有该变量的分支语句对应的行数,第三行和第四行表示在待测Java程序中分支语句的行数以及与该分支语句存在分支交互依赖的分支语句的行数;对于存在分支潜在依赖的<bri,brj>,第五行和第六行表示bri和对应的brj集合,第七行和第八行表示brj和对应的bri集合。
CN202310366027.1A 2023-04-07 2023-04-07 一种面向高mc/dc的符号执行方法 Active CN116383070B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202310366027.1A CN116383070B (zh) 2023-04-07 2023-04-07 一种面向高mc/dc的符号执行方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202310366027.1A CN116383070B (zh) 2023-04-07 2023-04-07 一种面向高mc/dc的符号执行方法

Publications (2)

Publication Number Publication Date
CN116383070A true CN116383070A (zh) 2023-07-04
CN116383070B CN116383070B (zh) 2023-12-05

Family

ID=86976466

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202310366027.1A Active CN116383070B (zh) 2023-04-07 2023-04-07 一种面向高mc/dc的符号执行方法

Country Status (1)

Country Link
CN (1) CN116383070B (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN118227509A (zh) * 2024-05-20 2024-06-21 中国船舶集团有限公司第七一九研究所 一种在短路求值时生成mc/dc测试用例集的方法及系统

Citations (16)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20060010428A1 (en) * 2004-07-12 2006-01-12 Sri International Formal methods for test case generation
CN101710305A (zh) * 2009-12-14 2010-05-19 中国科学院计算技术研究所 一种计算机软件白盒测试的实现方法及系统
US20100175052A1 (en) * 2009-01-05 2010-07-08 Tata Consultancy Services Limited System and method for automatic generation of test data to satisfy modified condition decision coverage
CN102073825A (zh) * 2011-01-28 2011-05-25 李清宝 基于路径驱动的可执行程序安全性检测方法及系统
CN102323906A (zh) * 2011-09-08 2012-01-18 哈尔滨工程大学 一种基于遗传算法的mc/dc测试数据自动生成方法
US20120311545A1 (en) * 2011-06-06 2012-12-06 Fujitsu Limited Lossless Path Reduction for Efficient Symbolic Execution and Automatic Test Generation
US20130318503A1 (en) * 2012-05-25 2013-11-28 Fujitsu Limited Symbolic execution and automatic test case generation for javascript programs
CN103455421A (zh) * 2013-08-19 2013-12-18 西安交通大学 基于程序控制依赖引导的回归测试案例生成方法
US20140068364A1 (en) * 2012-08-29 2014-03-06 Hcl Technologies Limited Modified condition/decision coverage test case automation
CN104461906A (zh) * 2014-12-30 2015-03-25 中国科学院软件研究所 一种基于代码转换的mc/dc覆盖准则的软件测试数据生成方法
WO2016004806A1 (zh) * 2014-07-07 2016-01-14 西安交通大学 基于程序约束构建的多线程程序输出唯一性检测与证据生成方法
JP2016115287A (ja) * 2014-12-17 2016-06-23 富士通株式会社 テストケース生成プログラム、テストケース生成方法及びテストケース生成装置
WO2017181628A1 (zh) * 2016-04-19 2017-10-26 西安交通大学 一种基于符号计算的动态并行程序污点分析方法
CN110515856A (zh) * 2019-09-02 2019-11-29 华东师范大学 一种基于动态符号执行的测试用例生成系统
CN112052177A (zh) * 2020-09-14 2020-12-08 北京一仿科技有限公司 一种多值耦合信号的mc/dc测试用例集生成方法
CN114817927A (zh) * 2022-03-30 2022-07-29 北京邮电大学 基于分支覆盖指导的有效符号执行方法及装置

Patent Citations (16)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20060010428A1 (en) * 2004-07-12 2006-01-12 Sri International Formal methods for test case generation
US20100175052A1 (en) * 2009-01-05 2010-07-08 Tata Consultancy Services Limited System and method for automatic generation of test data to satisfy modified condition decision coverage
CN101710305A (zh) * 2009-12-14 2010-05-19 中国科学院计算技术研究所 一种计算机软件白盒测试的实现方法及系统
CN102073825A (zh) * 2011-01-28 2011-05-25 李清宝 基于路径驱动的可执行程序安全性检测方法及系统
US20120311545A1 (en) * 2011-06-06 2012-12-06 Fujitsu Limited Lossless Path Reduction for Efficient Symbolic Execution and Automatic Test Generation
CN102323906A (zh) * 2011-09-08 2012-01-18 哈尔滨工程大学 一种基于遗传算法的mc/dc测试数据自动生成方法
US20130318503A1 (en) * 2012-05-25 2013-11-28 Fujitsu Limited Symbolic execution and automatic test case generation for javascript programs
US20140068364A1 (en) * 2012-08-29 2014-03-06 Hcl Technologies Limited Modified condition/decision coverage test case automation
CN103455421A (zh) * 2013-08-19 2013-12-18 西安交通大学 基于程序控制依赖引导的回归测试案例生成方法
WO2016004806A1 (zh) * 2014-07-07 2016-01-14 西安交通大学 基于程序约束构建的多线程程序输出唯一性检测与证据生成方法
JP2016115287A (ja) * 2014-12-17 2016-06-23 富士通株式会社 テストケース生成プログラム、テストケース生成方法及びテストケース生成装置
CN104461906A (zh) * 2014-12-30 2015-03-25 中国科学院软件研究所 一种基于代码转换的mc/dc覆盖准则的软件测试数据生成方法
WO2017181628A1 (zh) * 2016-04-19 2017-10-26 西安交通大学 一种基于符号计算的动态并行程序污点分析方法
CN110515856A (zh) * 2019-09-02 2019-11-29 华东师范大学 一种基于动态符号执行的测试用例生成系统
CN112052177A (zh) * 2020-09-14 2020-12-08 北京一仿科技有限公司 一种多值耦合信号的mc/dc测试用例集生成方法
CN114817927A (zh) * 2022-03-30 2022-07-29 北京邮电大学 基于分支覆盖指导的有效符号执行方法及装置

Non-Patent Citations (2)

* Cited by examiner, † Cited by third party
Title
WENXUAN WANG: "Automatic Test Case Generation fromFormal Requirement Model for Avionics Software", 《HTTPS://IEEEXPLORE.IEEE.ORG/ABSTRACT/DOCUMENT/9265881/》 *
洪伟疆;刘怡君;陈振邦;董威;王戟;: "面向MC/DC的符号执行编译优化(英文)", FRONTIERS OF INFORMATION TECHNOLOGY & ELECTRONIC ENGINEERING, no. 09 *

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN118227509A (zh) * 2024-05-20 2024-06-21 中国船舶集团有限公司第七一九研究所 一种在短路求值时生成mc/dc测试用例集的方法及系统
CN118227509B (zh) * 2024-05-20 2024-09-17 中国船舶集团有限公司第七一九研究所 一种在短路求值时生成mc/dc测试用例集的方法及系统

Also Published As

Publication number Publication date
CN116383070B (zh) 2023-12-05

Similar Documents

Publication Publication Date Title
CN110543421B (zh) 基于测试用例自动生成算法的单元测试自动执行方法
US8020153B2 (en) Source code checker, source code checking method, program for causing execution of the method, and storage medium for storing the program
US8627290B2 (en) Test case pattern matching
US20110314337A1 (en) Method and Apparatus for Locating Input-Model Faults Using Dynamic Tainting
JP2015043198A (ja) 解析システム、解析方法および解析プログラム
Li et al. Practical symbolic race checking of GPU programs
EP3264274B1 (en) Input discovery for unknown program binaries
CN112380120B (zh) 单元测试代码结构自动解析与路径分析方法
CN116383070B (zh) 一种面向高mc/dc的符号执行方法
Delahaye et al. Infeasible path generalization in dynamic symbolic execution
EP2972880A1 (en) Kernel functionality checker
JP2009211424A (ja) 最適化箇所判定装置及び最適化箇所判定システム及びコンピュータプログラム及び最適化箇所判定方法
CN116483700A (zh) 一种基于反馈机制的api误用检测与修正方法
CN114706769B (zh) 基于日志的面向回归测试的黑盒测试用例排序方法
CN115310095A (zh) 一种区块链智能合约混合形式化验证方法及系统
CN114138669A (zh) 一种基于函数级选择符号化混合执行的软件自动测试方法
Sun et al. A hierarchical CPN model automatically generating method aiming at multithreading program algorithm error detection
De Moura et al. Bugs, moles and skeletons: Symbolic reasoning for software development
Matoussi et al. A mapping approach between IR and binary CFGs dealing with aggressive compiler optimizations for performance estimation
CN113282495A (zh) 一种基于轨迹监控的Java软件故障定位方法
Zhang et al. How Effective Are They? Exploring Large Language Model Based Fuzz Driver Generation
Li et al. Effective fault localization based on minimum debugging frontier set
Lööw et al. Matching plans for frame inference in compositional reasoning
Duarte et al. Extraction of probabilistic behaviour models based on contexts
CN118445214B (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