掌桥专利:专业的专利平台
掌桥专利
首页

一种基于长时执行测试程序过滤的编译器测试加速方法

文献发布时间:2023-06-19 19:32:07


一种基于长时执行测试程序过滤的编译器测试加速方法

技术领域

本发明涉及软件测试领域,特别是编译器测试的加速,是一种基于长时执行测试程序过滤的编译器测试加速方法。

背景技术

编译器是用于编译软件源代码生成可执行软件的基础软件。作为软件开发的基石,任何可执行软件的生成都离不开编译器的基础支撑。编译器中的缺陷会生成不正确的程序从而导致软件运行出错,甚至产生灾难性的后果,因此,保障编译器的质量是至关重要的。为了能够全面地测试编译器,最常用的方法是对编译器进行压力测试,让编译器执行尽可能多的测试程序。然而在实际的测试过程中,某些测试程序的运行时间数百数千倍于其它测试程序,甚至根本不会结束运行。我们将这一类测试程序称之为长时执行测试程序,它们会严重影响编译器测试的效率。因此,开发人员通常会在测试程序执行的过程中设置一个时间限制,如果测试程序的执行时间超过了时间限制,便会立刻被终止执行。目前,针对编译器测试过程中测试程序执行时间过长的问题,测试人员并没有对此给予足够的重视。如何有效识别这些执行时间很长的测试程序仍然面临着许多挑战。代码覆盖信息是代码在执行过程中的统计信息,可以在一定程度上反映出测试程序的执行情况,结合测试程序的执行信息,在测试过程中准确识别出潜在长时执行测试程序,并提前结束测试程序的运行可以有效地节省测试时间,从而加速编译器测试的过程。

发明内容

本发明提出了一种基于长时执行测试程序过滤的编译器加速方法。通过本发明,编译器测试人员可以测试程序投入运行的初始阶段识别出潜在执行时间过长的测试程序并终止其运行。本发明能够有效地节省编译器测试的时间开销,进而达到加速编译器测试的目的。

为了加速编译器测试,本发明公开了一种基于长时执行测试程序过滤的编译器加速方法,具体包含下列步骤:

步骤1,使用工具对测试程序进行插桩;

步骤2,通过代码覆盖工具生成测试程序运行时的覆盖报告;

步骤3,分析覆盖报告;

步骤4,过滤覆盖信息超过给定值的覆盖报告对应的测试程序。

步骤1中,通常情况下,测试程序在运行结束之前,测试人员无法获取它的覆盖信息。本方法首先通过随机程序生成器生成大量的测试程序,然后对每一个测试程序进行插桩,对于插桩后的测试程序,测试人员可以在测试程序运行的过程中随时获取测试程序当前运行状态下的覆盖信息。

步骤2中,长时执行测试程序在运行的过程中如果不设置运行时间限制而是等待运行结束,会消耗大量测试时间且有可能得不到测试结果。本方法在测试的过程中,对于每一个测试程序,都设置一个很小的运行时间限制,如果测试程序在该时间限制内运行没有结束,本方法将获取测试程序在该运行状态下的覆盖信息并暂时停止该测试程序的执行。

步骤3中,现有的随机程序生成器在设计之初都是为了针对编译器某些组件或是某些特性来进行测试的,其生成的测试程序都是基于规约生成特定的测试程序,因此同一随机程序生成器生成的测试程序的结构较为单一,大部分由随机程序生成器生成的长时执行测试程序中都包含超大循环或者是死循环,本发明利用这一特性,将对长时执行测试程序的检测转换为对测试程序中超大循环或死循环的检测。

步骤4中,对于疑似长时执行测试程序所产生的覆盖信息,本方法设计了一种检测算法通过覆盖信息来判断测试程序中是否包含超大循环或死循环。在完成对长时执行测试程序的检测之后,对于判断为长时执行的测试程序,结束它的执行并将它丢弃,与该测试程序有关的测试结果也不会被统计在编译器测试的结果中,该测试程序在后续的测试过程中也不会再被使用。对于判断为非长时执行的测试程序,继续执行并等待该测试程序的执行直到超出执行时间限制。

本发明提出将长时执行测试程序的检测问题转化为测试程序中超大循环或死循环的检测问题,通过对测试程序进行插桩,获取测试程序在运行过程中的覆盖信息,结合本方法提出的检测算法判断测试程序中是否包含超大循环或死循环,排除检测为长时执行的测试程序,留下非长时执行的测试程序继续进行测试。(整个流程都可以通过脚本自动化,大大减轻了人工判断长时执行测试程序的负担)。

有益效果:通过本方法可以在测试过程中简单快捷地识别出长时执行测试程序,避免长时执行测试程序执行到超出运行时间限制再终止,极大地节省了测试的时间,从而有效地加速了编译器测试的过程。

附图说明

下面结合附图和具体实施方式对本发明做更进一步的具体说明,本发明的上述或其他方面的优点将会变的更加清楚。

图1是基于长时执行测试程序过滤的编译器加速方法流程图。

图2是插桩测试程序的说明图。

图3是基于覆盖信息的超大循环或死循环检测算法的流程图。

具体实施方式

为了使本发明的目的、技术方案和优点更加清楚明晰,本章结合附图对发明做更进一步的详细描述。

图1为本发明一种基于长时执行测试程序过滤的编译器加速方法的流程图。包括4个步骤,过程如下:

步骤1,针对每一个测试程序P,使用修改器插桩得到测试程序Q;

步骤2,执行测试程序Q,给定一个很短的执行时间,如果测试程序Q在给定的时间内执行完成,则测试正常结束,如果Q没有在给定的时间内执行完成,获取Q在当前状态下的覆盖信息C,暂时停止执行Q;

步骤3,检测覆盖信息C,判断测试程序Q中是否包含超大循环或死循环;

步骤4,排除包含超大循环或死循环的测试程序,结束该测试程序的执行,不包含超大循环或死循环的测试程序继续执行进行后续测试。

图2是插桩测试程序的说明图,用于获取测试程序在运行过程中的覆盖信息,具体说明如下:以“-”开头的代码行对应的代码为测试程序P的原始代码,以“A”开头的代码行对应的代码为插桩过程中添加的代码,原始代码结合添加的代码构成了测试程序Q的代码。在12-14行中,测试程序P中存在一个死循环,第4行是函数“_gcov_flush()”的声明,它是代码覆盖工具中将覆盖信息转储到中间文件的核心函数。第17-23行定义了一个用于接收用户信号“SIGUSR1”的信号处理器,当程序在运行时接收到“SIGUSR1”信号时,“sa_handler”的默认值“SIG_IGN”将变为“SIGUSR1”。因此,当第22行中if语句的条件被满足时,将调用“new_action”的函数“sa_hander”方法。由第18行的代码可知,程序会调用“dump_coverage()”函数中的“_gcov_flush()”将运行程序的当前状态的覆盖信息将转储到中间文件中。最后,代码覆盖工具通过读取中间文件便可以得到测试程序在当前状态下的覆盖信息。此过程中,代码覆盖工具可以是Gcov,获取到的覆盖信息可以是测试程序的分支执行次数。

图3是死循环检测算法的说明图,整个检测的流程如下:

给定一个覆盖报告,对其进行遍历,每当遇到循环分支,获取分支的执行次数,如果分支的执行次数大于给定的阈值,结束遍历,认定该覆盖报告对应的测试程序包含超大循环或死循环,如果执行次数小于给定的阈值,继续遍历。如果遍历正常结束,则认为该覆盖报告对应的测试程序不包含超大循环或死循环。在实施的过程中,给定的执行时间设定为0.01秒,执行次数的阈值设定为200000。

本发明提供了一种基于长时执行测试程序过滤的编译器加速方法,具体实现该技术方案的方法和途径很多,以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。本实施例中未明确的各组成部分均可用现有技术加以实现。

相关技术
  • 基于遗传方法和符号执行的组合加速测试用例生成方法
  • 基于机器学习的编译器测试加速方法
  • 基于机器学习的编译器测试加速方法
技术分类

06120115940430