代码检测

在实现覆盖测试的过程中,通常需要知道某些信息,例如执行可执行语句(即覆盖)的情况,程序执行的路径,变量的引用和定义。

为了获得这样的信息,有必要跟踪被测程序的执行过程,或者在执行被测程序期间由计算机自动记录。

前者需要人工进行,效率低,无聊;后者需要插入代码来完成被测程序中的相应工作,即代码插入技术。

今天的大多数覆盖测试工具都使用代码堆叠技术。

在测试常见应用程序的软件时,由于计算机配置越来越高,计算机运行得越来越快,代码检测引起的问题并不明显或在可接受的范围内。

但对于嵌入式软件来说,这是一个致命的问题。

由于嵌入式系统具有有限的系统资源(小内存,较少的I / O通道等),过多的代码扩展速率将使程序无法在嵌入式系统中运行;同时,嵌入式软件通常具有很强的实时性能。

程序的输出仅在有限的时间内有效,并且“正确”的输出仅在有限的时间内有效。

迟到的结果是无用的,甚至变得错误和有害。

代码检测技术可能破坏程序的时间特性等,从而导致软件执行错误。

因此,我们需要更高效的代码检测技术来完成覆盖测试,尤其是嵌入式软件的覆盖测试。

由于程序检测技术将探针插入到被测程序中,然后通过执行探针获得程序的控制流程和数据流信息,从而实现了测试的目的。

因此,根据探针插入的时间,可以分为目标代码检​​测和源代码检测。

(1)目标代码检​​测的前提是转到目标代码:执行必要的分析以确定检测的位置和内容。

由于目标代码的格式主要与操作系统有关,并且与特定的编程语言和版本无关,因此它已被广泛使用,特别是在需要监视存储器的软件中。

但是,由于目标代码中的语法和语义信息不完整,并且仪器技术需要对代码词法语法的分析有很高的要求,因此源代码通常用于覆盖测试工具中。

(2)源代码检测是基于对源文件的完整分析:词法分析和语法分析,确保源文件的检测能够实现高精度和针对性。

但是,源代码检测需要暴露给源代码,这会使工作负载变大,并且需要修改,因为编码语言和版本不同。

在下文中,我们引用了仪器的程序,它指的是源代码检测。

(1)仪器的位置:探头的植入应紧凑,精确,以确保所收集的信息全面无冗余,降低了代码的扩展速度。

因此,当确定仪器的位置时,程序被分割,并且基本分割方法基于“块”。

结构体。

根据块结构的划分,在以下情况下植入探针:a。

该计划的第一份声明;湾分支声明的开头; C。

循环语句的开始; d。

下一个条目陈述前的陈述; e。

该计划的最终声明; F。

分支声明的结尾; G。

循环语句的结尾;另外,根据覆盖测试的要求,仪器的位置,除上述情况外,覆盖测试要求的变化也有变化。

(2)仪表策略:仪表策略是解决“如何插入”的问题。

传统的检测策略是在需要检测的所有位置插入探针,在程序操作期间收集所有可能的程序信息,并将它们写入数据库进行分析和处理。

该方法将导致大量程序的大量工作,低效率和大的代码扩展速率。

每次根据不同的测试要求插入不同的探针,采用相应的仪器策略,降低了代码的扩展速度,保证了程序执行的效率。

以下是几种探针的仪器策略的简要介绍。

语句覆盖探测器(基本块探测器):在基本块的入口和出口处,分别植入相应的探针以确定在执行程序时是否覆盖基本块。

分支覆盖探测:在C / C ++语言中,分支由分支点确定。

对于每个分支,在开始时植入相应的探针以确定在执行程序时是否覆盖分支。

条件覆盖探测:在C / C ++中,if,swich,while,do-while,对于几个语法结构支持条件决策。

探针被植入用于变量跟踪的每个条件表达式的布尔表达式中。

取一个值来确定它的涵盖范围。

根据不同的测试要求,采用未使用的插入策略,每次在不同的位置植入相应的探头,每次仅植入有限数量的探头,大大降低了编码的扩展比和速度。

插入的桩。

使用1000行程序作为待测程序。

使用集成仪器和我们自己开发的工具的工具用于测试结果。

结果表明,前者的时间和代码扩展率分别为3s和35%。

堆的平均时间和平均代码扩展率分别为1s和8%,仪器时间显着提高,代码扩展率显着降低。

使用上述程序插入技术,除了通常的覆盖测试策略外,我们还可以实现MC / DC和LCSAJ测试。