当前位置: 首页 > 专利查询>南京大学专利>正文

一种基于调试信息支撑的代码覆盖器缺陷检测方法技术

技术编号:35833863 阅读:91 留言:0更新日期:2022-12-03 14:03
本发明专利技术提供了一种基于调试信息支撑的代码覆盖器缺陷检测方法,主要包括下列步骤:1)使用代码覆盖器为测试程序生成覆盖报告,获取代码覆盖信息;2)在调试器中单步调试运行程序,获取代码命中信息;3)在调试器中断点调试运行程序,获取代码命中信息;4)综合两种不同的调试策略下的命中计数,获得综合命中计数;5)比较代码覆盖信息和命中计数,检查是否违反预定义的异构蜕变关系;6)违反异构蜕变关系视为代码覆盖器中的缺陷。本发明专利技术利用调试信息对覆盖信息进行验证,解决了代码覆盖器测试中测试预言缺失的技术难题,且克服了现有方法的局限。该方法能有效检测覆盖器的缺陷,提高代码覆盖器质量。覆盖器质量。覆盖器质量。

【技术实现步骤摘要】
一种基于调试信息支撑的代码覆盖器缺陷检测方法


[0001]本专利技术涉及软件测试和缺陷检测领域,特别是代码覆盖工具的缺陷检测,是一种基于调试信息支撑的代码覆盖器缺陷检测方法。

技术介绍

[0002]代码覆盖信息是一种基础的程序动态信息,已广泛应用于软件工程的各项任务中,如软件测试、软件调试和程序理解等。代码覆盖信息是指程序代码动态执行的频次信息,在软件测试中有深入地应用,测试开发人员常基于代码覆盖信息来指导测试用例的生成和排序。在软件测试中,研究者提出了许多代码覆盖准则来指导软件测试的自动化,如语句覆盖、分支覆盖、条件覆盖和路径覆盖等。代码覆盖器是一种用于生成代码覆盖信息的基础软件,它的质量和可靠性对软件工程的各项任务提供基础保障。代码覆盖器中的缺陷不可避免地会影响依赖于它的各项软工任务,因此保障和提升代码覆盖工具的质量至关重要。然而,由于很难构造或缺少测试预言信息,自动化地测试代码覆盖器面临许多挑战。这里,测试预言是用于判定代码覆盖器所生成的覆盖信息是否正确的测试输出。为此,近期研究者分别提出了基于差分测试和基于蜕变测试的覆盖器缺陷检测方法。基于差分测试的方法通过差分对比多个代码覆盖器在同一个程序上的代码覆盖信息是否一致来检测覆盖器的缺陷。基于蜕变测试的方法首先使用覆盖信息构造等价程序,然后检查相互等价的程序中相同语句的覆盖信息是否一致来检测覆盖器的缺陷,可用于单个覆盖器的缺陷检测。然而,现有方法仍存在一定的局限:1)基于差分测试的方法需要多个覆盖器进行对比,而不同覆盖器实现不一致,对于在哪行代码应该具有覆盖率信息有不同的解释,导致基于差分测试的方法可能存在大量漏报;2)基于蜕变测试的方法通过修剪未执行的语句来生成等价程序,如果每行代码均报告为执行或是未执行的代码不是独立语句,就无法生成等价程序,从而导致基于等价程序的蜕变测试方法不可用。为此,本专利技术提出了一种基于调试信息支撑的代码覆盖器缺陷检测方法以解决现有局限,利用调试信息构造异构蜕变关系,以对覆盖器生成的代码覆盖信息进行验证,能更加有效的检测覆盖器中的缺陷,从而提升代码覆盖器的质量。

技术实现思路

[0003]本专利技术在于提供一种基于调试信息支撑的代码覆盖器缺陷检测方法,解决代码覆盖器测试中测试预言难构造的难题,并克服现有方法的局限。本专利技术能有助于提升代码覆盖器的质量,进而为其他基于覆盖信息的软件工程任务提供可靠的支撑。
[0004]为了有效测试代码覆盖器,本专利技术公开了一种基于调试信息支撑的代码覆盖器缺陷检测方法,具体包括下列步骤:
[0005]步骤1,使用覆盖器为测试程序生成覆盖报告,获取代码覆盖信息;
[0006]步骤2,使用调试器以“单步步进”策略调试执行程序,获取代码命中信息;
[0007]步骤3,使用调试器以“断点继续”策略调试执行程序,获取代码命中信息;
[0008]步骤4,综合步骤2和步骤3两种不同的调试策略下的命中计数,以获得每行代码的综合命中计数;
[0009]步骤5,比较代码覆盖信息和代码综合命中信息,检查是否违反预定义的异构蜕变关系;
[0010]步骤6,违反异构蜕变关系视为代码覆盖器中的缺陷。
[0011]步骤1中,对于给定的测试程序,为编译器指定覆盖分析选项,通过代码覆盖器为每个测试程序生成相应的覆盖报告,获取代码覆盖信息。
[0012]步骤2中,使用调试器以“单步步进”策略获取程序代码的命中计数,首先使用编译器开启调试选项编译步骤1中的测试程序以生成包含调试信息的可执行程序,然后在调试器中逐行调试执行程序,调试器中每执行一步,检查当前堆栈帧,记录命中的语句并计数。以GDB为例,使用调试操作序列“start

while(true){frame

step}”迭代查询当前堆栈帧,直到程序退出。
[0013]步骤3中,使用调试器以“断点继续”策略获取程序代码的命中计数,针对步骤2编译得到的包含调试信息的可执行程序,首先使用调试器为所有具有调试信息的语句设置断点,接着调试运行程序并观察其执行,当调试器停在任何断点时,检查当前堆栈帧,记录命中的语句并计数。以GDB为例,使用调试操作序列“break s1

break s2

...

run

while(true){frame

continue}”迭代查询堆栈帧,直到程序退出。
[0014]步骤4中,综合步骤2和步骤3两种不同的调试策略中的命中计数,以获得每行代码的综合命中计数。具体而言,对于任何源代码行,如果“单步步进”策略与“断点继续”策略获取的命中数不一致,这两种不同调试策略的命中率都将用于以后的比较。这是因为两种策略中的任何一种单独获得的命中计数都不能准确地表示每个语句的实际执行频率。例如,如果源代码行是函数调用,在“断点继续”策略下调试运行时,函数调用将只命中一次,而在“单步步进”策略下,调试器将在到达函数调用时命中该行,然后在从被调用处返回后再次命中该行。因此,“单步步进”策略在函数调用时获取的命中计数不能代表实际执行频率。如果源代码行是“for(initialize;condition;increment)”循环,则在执行到达“for”循环时,在“断点继续”策略中只会命中一次。之后,无论条件和增量表达式执行了多少次,这个“for”循环都不会再次被命中。因此,“断点继续”策略在“for”循环时获取的命中计数不能代表实际执行频率。因此,需要综合这两种不同的调试策略得到的命中计数。
[0015]步骤5中,检查覆盖信息和程序的命中计数是否违反预定义的异构蜕变关系来发现代码覆盖器中的缺陷。具体而言,对于带有调试信息和覆盖信息的源代码行,检查覆盖统计与这两种不同调试策略的命中数是否一致。这里,预定义的异构蜕变关系是,若语句同时包含覆盖率信息和调试信息,则覆盖器提供的覆盖信息、应与调试器提供的命中计数一致。在具体判断中有两种不同的情况:(1)如果源代码行既没有被“单步步进”策略命中,也没有被“断点继续”策略命中,则源代码行不应执行或没有覆盖信息;(2)如果源代码行被“单步步进”策略或“断点继续”策略命中,则源代码行应被执行或没有覆盖信息。
[0016]步骤6中,经人工审查确认代码覆盖器中有缺陷之后,将触发缺陷的程序和对应的覆盖信息上报给开发者来进行确认和修复。
[0017]本专利技术使用调试器以不同的调试策略调试运行程序,从调试信息中获取程序代码命中计数,结合两种不同调试策略的代码命中信息对代码覆盖信息进行验证,从而检测代
码覆盖器的缺陷。本专利技术解决了覆盖器缺陷检测技术中缺少预期输出而无法验证覆盖器行为是否正确的关键问题,同时克服了现有覆盖器缺陷检测技术的局限,能有效检测代码覆盖器的缺陷,进而提高代码覆盖器的质量。
[0018]有益效果:通过本方法可以有效对代码覆盖器进行系统的测试,同时避免了构造测试预言,有效应对了测试预言缺失的挑战,可以有效检测代码覆盖工具的本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种基于调试信息支撑的代码覆盖器缺陷检测方法,其特征在于利用调试信息构造异构蜕变关系对覆盖信息进行验证来检测代码覆盖器中潜在的缺陷,该方法将代码覆盖器验证的复杂问题转换成了一个简单的调试信息与覆盖信息的比较问题,从而解决了目前代码覆盖器测试中测试预言难以构造的难题。这里,测试预言是用于验证覆盖器生成的代码覆盖信息是否正确的预期输出。该方法能有效检测覆盖器中的缺陷,提高代码覆盖器的质量。本方法主要包括下列步骤:1)使用覆盖器生成语句覆盖信息:首先,对于给定的测试程序,使用编译器并指定覆盖剖析选项将源码程序编译为可执行程序,执行该程序后使用代码覆盖器生成覆盖报告,获取代码覆盖信息。2)使用调试器以“单步步进”策略调试执行获取语句命中次数:接着,对于步骤1中的测试程序,使用编译器并指定调试选项将源码程序编译为包含调试信息的可执行程序,然后在调试器中以“单步步进”策略调试执行程序,即逐行调试执行程序,记录每一步命中的语句,获取程序中每行语句命中的次数。3)使用调试器以“断点继续”策略调试执行获取语句命中次数:对于步骤2中生成的包含调试信息的可执行程序,采用“断点继续”策略调试执行程序,即为所有具有调试信息的语句设置断点,当调试器停在任何断点时,记录当前命中的语句,获取程序中每行语句命中的次数。4)综合两种调试策略程序代码命中信息:由于调试器存在不同的实现,两种调试策略中的任何一种单独获得的语句命中计数可能都不能准确地表示每个语句的实际执行频率,如在某些调试器中“单步步进”调试策略中函数调用语句的命中计数不能代表其实际执行频次,而“断点继续”调试策略中循环语句的命中计数不能代表其实际执行频次,因此需要综合两种不同的调试策略下的命中计数,将不一致的命中计数都用于以后的比较。5)检查覆盖信...

【专利技术属性】
技术研发人员:杨已彪李清扬王洋孙茂林卢红敏周毓明
申请(专利权)人:南京大学
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1