【技术实现步骤摘要】
一种映射关系制导的循环代码模糊测试方法
[0001]本专利技术涉及软件测试领域,特别涉及一种映射关系制导的循环代码模糊测试方法。
技术介绍
[0002]工业软件随着自身的演化与迭代,导致软件规模不断扩大,软件中存在的缺陷也随之增多。软件缺陷是在软件编码实现过程中引入的错误,这些软件缺陷可能会导致软件非正常运行,甚至造成经济损失或危及生命安全。
[0003]软件测试是能够减少软件缺陷的有效手段,根据是否运行被测软件可分为静态分析和动态测试两种类型。静态分析指分析代码的控制流、数据流等信息判断是否存在软件缺陷。动态分析指运行被测程序,并观察运行情况和运行结果判断是否存在软件缺陷。
[0004]模糊测试是动态分析中的一种,模糊测试的主要思想是产生大量有效或部分有效的输入作为测试用例,发送给被测程序使其执行,通过监控被测软件的执行情况,收集测试对象(如函数、基本块、循环代码或其他代码结构等)的覆盖情况,发现如程序崩溃、违反断言等现象,从而判断是否存在软件缺陷。
[0005]模糊测试技术的核心在于测试用例的质量,高质量的测试用例能够覆盖更多的软件代码,从而更全面地对软件代码进行分析和测试。现有的模糊测试技术中,AFL等覆盖率制导的模糊测试工具使用遗传算法作为测试用例的保留策略,将能够覆盖到更多代码的测试用例保留,然后使用字节级操作(如位反转等)对被保留的测试用例进行变异,从而生成能够提高代码覆盖率的测试用例。
[0006]然而,AFL等覆盖制导的模糊测试工具没有充分利用程序中的控制流等语义信息, ...
【技术保护点】
【技术特征摘要】
1.一种映射关系制导的循环代码模糊测试方法,其特征在于,包括:S1:输入被测项目,插桩循环代码结构,编译并输出被测程序;S2:输入初始测试用例并进行变异,将变异后的测试用例加入到测试用例队列,发送到所述被测程序运行,判断所述测试用例队列是否满足模糊测试终止条件,若满足,则输出覆盖情况统计表;若不满足,则对所述测试用例队列中的测试用例进行变异,生成子代测试用例,以满足所述模糊测试终止条件;S3:输入所述覆盖情况统计表,训练深度学习模型并反向计算权重距离和,构建并输出所述测试用例的字节序列与循环代码结构覆盖情况之间的映射关系;S4:基于所述映射关系,对与所述循环代码结构覆盖情况对应的所述测试用例中的相应字节序列进行变异,生成子代测试用例;S5:将S4所述子代测试用例作为所述S2被测程序的输入,进行模糊测试,直到满足所述模糊测试终止条件,输出模糊测试报告。2.根据权利要求1所述的一种映射关系制导的循环代码模糊测试方法,其特征在于,S1具体为:S1
‑
1:输入所述被测项目;S1
‑
2:读取并遍历所述被测项目的测试对象序列,判断该测试对象Object
i
是否为循环代码结构,若是,则执行步骤S1
‑
3;否则执行步骤S1
‑
4;S1
‑
3:对所述测试对象Object
i
执行插桩,插桩完成后执行步骤S1
‑
4;S1
‑
4:判断测试对象序列是否全部遍历,若全部遍历则执行S1
‑
5,否则执行S1
‑
2;S1
‑
5:将插桩后的被测项目编译为被测程序;S1
‑
6:输出所述被测程序。3.根据权利要求1所述的一种映射关系制导的循环代码模糊测试方法,其特征在于,S2具体为:S2
‑
1:输入所述初始测试用例和所述被测程序,将初始测试用例加入到测试用例队列中;S2
‑
2:判断是否满足所述模糊测试终止条件,若尚未满足所述终止条件则执行步骤S2
‑
3,否则执行S2
‑
13;S2
‑
3:将所述测试用例队列中的测试用例进行变异,将生成的子代测试用例加入到测试用例队列中;S2
‑
4:从所述测试用例队列中依次读取队列中的子代测试用例,将子代测试用例发送至所述被测程序,作为所述被测程序的输入,直到所述测试用例队列为空;S2
‑
5:运行所述被测程序并收集每条所述子代测试用例的覆盖情况;S2
‑
6:遍历所述子代测试用例,若所述子代测试用例尚未被完全遍历则执行S2
‑
7,否则执行S2
‑
2;S2
‑
7:读取所述测试用例队列Te中的第i个子代测试用例t
i
,以及所述子代测试用例t
i
对应的覆盖情况;S2
‑
8:判断所述子代测试用例t
i
是否触发崩溃,若触发崩溃则执行步骤S2
‑
10,否则执行S2
‑
9;S2
‑
9:判断所述子代测试用例t
i
是否覆盖到更多循环代码结构,若覆盖到更多循环代码
则执行S2
‑
11,否则执行S2
‑
5;S2
‑
10:将所述子代测试用例t
i
保存到本地;S2
‑
11:将所述子代测试用例t
i
加入到测试用例队列;S2
‑
12:将所述子代测试用例以及对应的覆盖情况保存到覆盖情况统计表中;执行S2
‑
6;S2
‑
13:输出覆盖情况统计表。4.根据权利要求1所述的一种映射关系制导的循环代码模糊测试方法,其特征在于,S3具体为:S3
‑
1:输入由测试用例集Te=(t1,t2,
…
,t
n
)
T
和测试用例的覆盖情况集S=(s1,s2,
…
,s
n
)
T
组成的所述覆盖情况统计表;其中,n为所述测试用例数量,Te中的元素为所述测试用例,S中的元素为所述测试用例的覆盖情况;S3
‑
2:将所述测试用例集Te和所述测试用例的覆盖情况集S转化为深度学习模型可以识别的训练数据;t
i
为第i个测试用例,将所述测试用例集Te=(t1,t2,
…
,t
n
)
T
中的测试用例t
i
进行二进制转化,选择前k个二进制字节作为所述测试用例t
i
的二进制字节序列,t
i
=(x
i,1
,x
i,2
...
还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。