章节目录:
C/C++test 的多指标覆盖率分析允许在执行 C/C++test 外部的独立应用程序或库时监控代码覆盖率。
C/C++test 附带一个独立的覆盖率包,包含以下组件:
<INSTALL_DIR>/cpptestcc
- 集成到您的构建流程中的覆盖率工具,用于应用程序插桩以收集原始覆盖率数据。<INSTALL_DIR>/engine/coverage/runtime
- 需要与插桩的应用程序集成的覆盖率运行时库。cpptestcc
收集覆盖率分为三个阶段:cpptestcc
工具集成到构建中来进行应用程序插桩。cpptestcc
快速入门将路径添加到 <INSTALL_DIR>
PATH
系统变量,使 cpptestcc
工具能够执行。
cpptestcc
可执行文件作为编译器命令的前缀,通过 --
进行分隔。 例如:原始编译命令行
cc -I app/includes -D defines -c source.cpp |
更新后的编译命令行
cpptestcc -compiler gcc_9-64 -line-coverage -- cc -I app/includes -D defines -c source.cpp |
cpptestcc 工具至少要求在命令行配置以下参数:- 编译器标识符: - 覆盖率指标(例如, 有关其他选项的信息,请参阅 cpptestcc 命令行参考。 |
原始命令行
lxx -L app/lib app/source.o somelib.lib -o app.exe |
更新后的命令行
lxx -L app/lib app/source.o somelib.lib [INSTALL_DIR]/engine/coverage/runtime/lib/cpptest.lib -o app.exe |
如果覆盖率运行时库作为共享(动态加载)库链接,则必须确保在启动插桩的应用程序时可以加载该库。这通常需要将 |
C/C++test 为原生 Windows 和 Linux 应用程序提供了预建的覆盖率运行时库。对于跨平台和嵌入式测试,该运行时库需要从 |
cpptestcc
会创建 .cpptest/cpptestcc
文件夹,存储重要的覆盖率相关数据(“覆盖率映射”)。默认情况下,该文件夹位于当前编译的工作目录中。可以使用 -workspace <path>
选项更改默认位置;详细信息请参阅 cpptestcc 命令行参考。 cpptest_results.clog
文件中。Load Application Coverage 测试配置假设 .cpptest/cpptestcc
文件夹和 cpptest_results.clog
文件存储在默认位置。要自定义该位置,需在测试配置中配置以下执行细节(执行> 常规> 执行细节):
- Coverage map files root location - default: ${project_loc}/.cpptest/cpptestcc
- Coverage log files - default: ${project_loc}/*.clog
默认情况下,Load Application Coverage 测试配置会尝试加载有关支持的所有覆盖率指标的信息。要自定义支持的覆盖率指标列表,可前往执行> 常规> 执行细节> 插桩模式> 插桩功能> C/C++ 代码覆盖率指标,然后选择需要报告的指标。
我们建议与编译命令行中为 cpptestcc
工具启用的指标保持一致。
您可以使用 C/C++test 附带的脚本快速配置 MSBuild 项目以集成覆盖率分析。此脚本支持 Visual Studio 和 Cmake 生成的 MSBuild 项目。该脚本创建目标 .vcxproj 文件的备份并修改,从而在所有构建目标上启用所需的 Parasoft 功能。
C/C++test 有一个 Python 脚本启动器,用于运行包含的工具,可以在以下位置找到:
<CPPTEST_INSTALL_DIR>/engine/bin/cpptestpy.exe |
<CPPTEST_INSTALL_DIR>/integration/msbuild/msbuild_cpptest.py |
收集 MSBuild 项目覆盖率的步骤:
请确保未在 = 后面使用双引号,否则会导致不正确的字符串解释。
设置 CPPTEST_INSTALL_DIR
变量。
set CPPTEST_HOME=<CPPTEST_INSTALL_DIR> |
设置 PATH
变量。
set PATH=%PATH%;%CPPTEST_HOME\engine\coverage\runtime\bin |
(仅限 Cmake)使用 Cmake 生成 MSBuild 文件。
cd <PROJECT_DIR> mkdir build cd build cmake .. |
运行集成脚本。
<cpptestpy.exe> <msbuild_cpptest.py> -c -f project.vcxproj |
使用 MSBuild 构建项目。
msbuild -t:Rebuild project.sln |
要收集覆盖率,需进入构建目录并运行该项目。
cd x64\Debug project.exe |
包含覆盖率信息的 .clog 文件将在您当前的工作目录中生成。
文件默认命名为 cpptest_results.clog
。
生成覆盖率报告。
cpptestcli.exe \ -solution Sensor.sln \ -config "builtin://Load Application Coverage" |
cpptestcc
命令行参考 您可以运行以下命令将可用选项打印到控制台中:
cpptestcc -help
可使用以下选项:
-compiler <name|path>指定要用于代码分析和插桩的编译器配置的名称。有关支持的编译器列表,请参阅编译器,或使用 示例:
配置文件格式(请参阅 -psrc): -list-compilers打印支持的所有编译器配置的名称。 配置文件格式(请参阅 -psrc): -include <file|pattern> and -exclude <file|pattern>在插桩范围中包含或从插桩范围中排除所有匹配指定模式的文件。 最终的过滤结果只有在按顺序指定所有包含/排除条目后才能确定。 支持以下通配符:
为防止 shell 将
配置文件格式(请参阅 -psrc): 示例 1: 示例项目结构:
如果您的项目具有以上结构,则以下命令将从插桩范围中排除
示例 2: 示例项目结构:
如果您的项目具有以上结构,则以下命令将仅对头文件插桩(不会对源文件插桩):
-ignore <pattern>指定在处理过程中将忽略的源文件。将编译匹配指定模式的文件,但不会进行解析或插桩。
您可以使用 支持以下通配符:
为防止 shell 将
配置文件格式(请参阅 -psrc): 示例:
-line-coverage启用行覆盖率收集。 执行代码时,运行时覆盖率结果将写入结果日志。这会为被测代码执行时间带来了一些开销,但是能够确保即使应用程序崩溃也能收集到覆盖率数据。 配置文件格式(请参阅 -psrc): -optimized-line-coverage启用行覆盖率优化收集。 运行时覆盖率结果存储在内存中,然后在应用程序完成后或根据用户请求写入结果日志。这种方式的性能更佳,但如果应用程序崩溃可能会丢失结果。 配置文件格式(请参阅 -psrc): -function-coverage启用函数覆盖率收集。 配置文件格式(请参阅 -psrc): -optimized-function-coverage启用函数覆盖率优化收集。配置文件格式(请参阅 -psrc):
-statement-coverage启用语句覆盖率收集。配置文件格式(请参阅 -psrc):
-optimized-statement-coverage启用语句覆盖率优化收集。 配置文件格式(请参阅 -psrc): -block-coverage启用基础块覆盖率收集。 配置文件格式(请参阅 -psrc): -optimized-block-coverage启用基础块覆盖率优化收集。 配置文件格式(请参阅 -psrc): -path-coverage启用路径覆盖率收集。 配置文件格式(请参阅 -psrc): -decision-coverage启用判定覆盖率收集。 配置文件格式(请参阅 -psrc): -optimized-decision-coverage启用判定覆盖率优化收集。 配置文件格式(请参阅 -psrc): -simple-condition-coverage启用简单条件覆盖率收集。 配置文件格式(请参阅 -psrc): -optimized-simple-condition-coverage启用简单条件覆盖率优化收集。 配置文件格式(请参阅 -psrc): -mcdc-coverage启用 MC/DC 覆盖率收集。 配置文件格式(请参阅 -psrc): -call-coverage启用调用覆盖率收集。 配置文件格式(请参阅 -psrc): -optimized-call-coverage启用调用覆盖率优化收集。 配置文件格式(请参阅 -psrc): -coverage-early-init启用在应用程序入口点开头初始化覆盖率模块。 配置文件格式(请参阅 -psrc): -coverage-auto-finalization启用后,覆盖率收集将在应用程序退出时自动完成。默认情况下启用此选项。 配置文件格式(请参阅 -psrc): -optimized-coverage-corruption-detection启用优化覆盖率指标的损坏检测算法。 配置文件格式(请参阅 -psrc): -template-coverage启用模板类和函数的覆盖率收集。 配置文件格式(请参阅 -psrc):
|
while(1) {} // no decision / branch if(false) {} // no decision / branch |
详细信息,请参阅在编译时已知判定结果时忽略判定/分支点。
此设置将影响判定(分支)覆盖率和路径覆盖率。该选项默认禁用。
配置文件格式(请参阅 -psrc):cpptestcc.ignoreConstDecisions
[true|false]
启用为同一源文件的不同编译存储覆盖率数据的多个变体。
默认情况下,cpptestcc 每次构建会收集每个源文件的覆盖率数据一次。在极少数情况下,当源文件在构建期间被多次编译时,您可以使用此选项为同一个源文件存储覆盖率数据的多个变体——每次编译一个变体。
此选项不支持通过多次编译同一源文件而引入冲突代码的方案。
禁用覆盖率插桩的自动恢复模式。
默认情况下,当无法成功进行文件插桩时,将在构建中使用该文件的原始(未插桩)版本。指定此选项后,如果出现插桩问题,构建将失败并出现错误。
指定一个自定义目录,在代码分析和插桩期间,有关代码结构的信息将存储在该目录中。cpptestcli
工具将使用该信息生成最终的覆盖率报告。
默认情况下,该信息存储在当前编译的工作目录中。如果编译使用多个工作目录,我们建议您指定一个自定义目录来确保所有覆盖率数据都存储在同一位置。
配置文件格式(请参阅 -psrc):cpptestcc.workspace <path>
使用从工作空间(请参阅 -workspace)收集的诊断文件创建压缩包。压缩包将存储在当前的工作目录中。
示例:
cpptestcc -techsupport
cpptestcc -techsupport -workspace path/to/workspace-dir
指定可以配置其他 cpptestcc
选项的配置文件的路径。
默认情况下,cpptestcc
会尝试读取当前工作目录或用户 HOME 目录中的 .psrc
文件。使用该选项可以指定配置文件的自定义位置。
如果在命令行和配置文件中都配置了选项,
cpptestcc
将使用命令行中指定的值。
显示从工作空间(请参阅 -workspace)中收集的诊断数据,包括错误和警告信息、文件数量等。
使用 -status-verbose
以显示更详细的信息。
示例:
cpptestcc -status
cpptestcc -status -workspace path/to/workspace-dir
cpptestcc -status-verbose
cpptestcc -status-verbose -workspace path/to/workspace-dir
打印有关版本的信息
-help
打印帮助消息并退出。
覆盖率运行时库是源代码插桩用来在应用程序运行时发出覆盖率信息的辅助函数和服务的集合。没有该库就无法链接已插桩的应用程序。根据被测项目的类型,运行时库可以通过多种方式链接到最终的可测试二进制文件。
除了为插桩的代码提供基本服务外,该库还用于使代码覆盖率解决方案适应特定的开发环境,例如支持被测嵌入式设备和开发主机之间覆盖率结果的非标准传输。
C/C++test 配备了运行时库的预建版本,适合在安装了 C/C++test 的平台上使用。在大多数情况下,从原生开发的应用中收集代码覆盖率信息可以使用预建版本的运行时库。
所有开发跨平台应用程序的用户都需要使用合适的交叉编译器和链接器准备覆盖率运行时库的自定义构建。代码覆盖率运行时库的源代码与 C/C++test 一起提供。
覆盖率运行时库自定义构建的准备过程通常受限于覆盖率运行时库源代码的编译。在某些情况下,您可能需要安装一些源代码片段,以使代码覆盖率适应特定的开发平台。该过程在以下部分说明。
C/C++test 包含以下二进制文件:
Windows(x86 和 x86-64)
文件 | 说明 |
---|---|
<INSTALL_DIR>/engine/coverage/runtime/lib/cpptest.a | 用于 Cygwin GNU GCC 编译器的 32 位导入库。添加到链接命令行。 |
<INSTALL_DIR>/engine/coverage/runtime/lib/cpptest64.a | 用于 Cygwin GNU GCC 编译器的 64 位导入库。添加到链接命令行。 |
<INSTALL_DIR>/engine/coverage/runtime/lib/cpptest.lib | 用于 Microsoft Visual C++ 编译器的 32 位导入库。添加到链接命令行。 |
<INSTALL_DIR>/engine/coverage/runtime/lib/cpptest64.lib | 用于 Microsoft Visual C++ 编译器的 64 位导入库。添加到链接命令行。 |
<INSTALL_DIR>/engine/coverage/runtime/bin/cpptest.dll | 32 位动态链接库。<INSTALL_DIR> /engine/coverage/runtime/bin 应添加到 PATH 环境变量。 |
<INSTALL_DIR>/engine/coverage/runtime/bin/cpptest64.dll | 64 位动态链接库。<INSTALL_DIR> /engine/coverage/runtime/bin 应添加到 PATH 环境变量。 |
文件 | 说明 |
---|---|
<INSTALL_DIR>/engine/coverage/runtime/lib/libcpptest.so | 32 位共享库。添加到链接命令行。<INSTALL_DIR> /engine/coverage/runtime/lib 应添加到 LD_LIBRARY_PATH |
<INSTALL_DIR>/engine/coverage/runtime/lib/libcpptest64.so | 64 位共享库。添加到链接命令行。<INSTALL_DIR>/engine/coverage/runtime/lib 应添加到 LD_LIBRARY_PATH |
如果您需要以非现成解决方案的形式使用运行时库,则可以准备一个符合特定开发环境要求的覆盖率运行时库的自定义构建。更多详细信息,请参阅自定义运行时库。
将覆盖率运行时库与被测应用程序链接过程集成通常需要修改链接器命令行,在某些情况下,还需要修改执行环境。该部分介绍如何在使用 C/C++test 提供的预建版本时修改链接过程。
Windows Cygwin GNU GCC 编译器的静态库:
Microsoft Visual C++ 编译器的动态链接库:
修改构建脚本,从而在链接器命令行中某处指定覆盖率运行时库——最好在所有目标文件之后。例如:
$(LXX) $(PRODUCT_OBJ) $(OFLAG_EXE)$(PROJ_EXECUTABLE) $(LXXFLAGS) $(SYSLIB) $(EXECUTABLE_LIB_LXX_OPTS) <INSTALL_DIR>/engine/coverage/runtime/lib/cpptest.lib |
确保将 lib
目录的路径添加到 PATH
环境变量,以便在启动被测程序时能够定位该库。也可以考虑将 cpptest.dll
(或 cpptest64.dll
)文件复制到与可执行文件所在的目录,或者复制到在被测应用程序启动期间为动态链接库扫描的其他位置。
Linux GNU GCC 编译器的共享库:
修改构建脚本,从而在链接器命令行中某处指定覆盖率运行时库——最好在所有目标文件之后。例如:
$(LXX) $(PRODUCT_OBJ) $(OFLAG_EXE)$(PROJ_EXECUTABLE) $(LXXFLAGS) $(SYSLIB) $(EXECUTABLE_LIB_LXX_OPTS) -L <INSTALL_DIR>/engine/coverage/runtime/lib -lcpptest |
-L
和 -lcpptest
选项。lib
目录的路径添加到 LD_LIBRARY_PATH
环境变量中,允许被测可执行文件找到共享库的路径。出现以下情况时,可能需要自定义运行时库:
运行时库源代码随 C/C++test 一起提供,位于 [INSTALL_DIR]
/engine/coverage/runtime
目录中。下表提供了该结构的描述:
Component | 说明 |
---|---|
include | 包含库头文件的目录。 |
src | 包含库源代码的目录。 |
Makefile | 为构建运行时库提供的基本 Makefile。 |
target | 包含一组 Makefile 包含文件的目录,这些文件具有编译器特定的选项,用于为主流的开发环境准备运行时库构建。 |
channel | 包含一组 Makefile 包含文件的目录,这些文件具有支持的通信通道的配置。 |
运行时库支持通过各种通信通道收集数据。使用的通信通道取决于开发环境。在大多数情况下,可以将结果存储在一个或多个文件中,但在其他情况下则可能需要使用 TCP/IP 套接字或 RS232 传输。在 cpptest.c
库源文件编译过程中,可以设置专用的宏值来启用特定的通信通道。将 -D<MACRO>
添加到编译命令行中设置该值。下表提供了通信通道控制宏的完整列表:
通道 | 说明 |
---|---|
CPPTEST_NULL_COMMUNICATION | 空实现。启用后,将不会发送任何结果。适用于初始测试构建和调试。 |
CPPTEST_FILE_COMMUNICATION | 基于文件的实现。使用 ANSI C 文件 I/O 接口。启用后,结果将会写入本地驱动器文件。 还提供了以下附加配置宏:
|
CPPTEST_SPLIT_FILE_COMMUNICATION | 基于文件的实现。使用 ANSI C 文件 I/O 接口。启用后,结果将会写入一系列本地驱动器文件。 可以使用以下宏配置此通道:
系列中的所有文件都放在同一个目录中。
|
CPPTEST_UNIX_SOCKET_COMMUNICATION | 基于 TCP/IP 套接字的实现。使用 POSIX API。启用后,结果将发送到指定的 TCP/IP 端口。提供以下附加配置宏:
|
CPPTEST_WIN_SOCKET_COMMUNICATION | 同上,使用 Windows API。 |
CPPTEST_UNIX_SOCKET_UDP_COMMUNICATION | 同上,基于 UDP 的实现。 |
CPPTEST_RS232_UNIX_COMMUNICATION | 基于 RS232 的实现。使用 POSIX API。启用后,通过指定的 RS232 系统设备发送结果。提供以下附加配置宏:
|
CPPTEST_RS232_WIN_COMMUNICATION | 同上。使用 Windows API。 |
CPPTEST_RS232_STM32F103ZE_COMMUNICATION | 基于 STM32F103x USART 的实现。使用 STM Cortex 库接口(需要 ST/STM32F10x/stm32f10x.h 头文件) |
CPPTEST_HEW_SIMIO_COMMUNICATION | Renesas HEW 模拟器具体实现。 |
CPPTEST_LAUTERBACH_FDX_COMMUNICATION | 基于 Lauterbach TRACE32 的实现(使用 FDX) |
CPPTEST_ITM_COMMUNICATION | 基于 ARM CoreSight ITM 单元的通信。需要 CMSIS 头文件。 |
CPPTEST_CUSTOM_COMMUNICATION | 启用用于自定义实现的空模板 |
如果使用提供的 Makefile 构建覆盖率运行时库,则可以使用 [INSTALL_DIR]/
engine/coverage/runtime/channel
目录中提供的其中一个 make 配置文件。
如果没有适合您的开发环境的通信通道实现,则可以提供自定义实现。以下说明描述了如何自定义运行时库,使其使用通信通道的自定义实现:
复制 [INSTALL_DIR]/engine/coverage/runtime/src/cpptest.c
并打开文件进行编辑。
找到 1.14“Custom Communication Implementation”部分。
Custom Communication Implementation 部分包含四种不同方法的空模板:
函数 | 说明 |
---|---|
void cpptestInitializeStream(void) | 该函数负责初始化通信通道,例如创建并连接套接字或初始化 UART 设备。 |
void cpptestFinalizeStream(void) | 该函数负责终止通信通道。例如,它可能负责关闭 TCP/IP 套接字。 |
| 该函数负责从数据缓冲区发送大小字节。 |
void cpptestFlushData(void) | 该函数负责清除数据。它的含义取决于特定的传输类型。该函数在一些实现中的应用可能受限,在这种情况下,该函数应该留空。 |
cpptest.c
时,将以下宏定义添加到编译命令行:-DCPPTEST_CUSTOM_COMMUNICATION
运行时库包含对多线程应用程序的支持。支持 POSIX、Windows 和 VxWorks API。您可以在 cpptest.c
编译时通过将 -D<MACRO>
添加到编译命令行来启用对特定多线程 API 的支持。下表提供了多线程 API 支持控制宏的完整列表:
宏 | 说明 |
---|---|
CPPTEST_NO_THREADS | 空实现。覆盖率运行时不与多线程应用程序一起使用 |
CPPTEST_WINDOWS_THREADS | Windows 多线程 API 实现 |
CPPTEST_UNIX_THREADS | POSIX 多线程 API 实现 |
CPPTEST_VXWORKS_THREADS | VxWorks 多线程 API 实现 |
如果将 C/C++test 的覆盖率引擎与不使用支持的多线程 API 的多线程应用程序使用,您可以自定义运行时库,从而与您的多线程 API 一起使用。需要完成以下步骤:
复制 [INSTALL_DIR]/engine/coverage/runtime/src/cpptest.c
并打开文件进行编辑。
找到 2.5“Custom Multithreading Implementation”部分。
Custom Multithreading Implementation 部分包含两种不同方法的空模板:
函数 | 说明 |
---|---|
static int cpptestLock(void) | 该函数确保覆盖率工具运行时库内部的同步操作。如果一个线程锁定了对运行时库服务的访问,这意味着一个原子操作正在进行,其他线程不可以使用运行时库服务。锁定释放后,其他线程才可以使用运行时库服务 |
static int cpptestUnlock(void) | 解除对运行时库服务的锁定。 |
为符合您的环境需求的方法提供实现。
编译 cpptest.c
时,将以下宏添加到编译命令行:-DCPPTEST_CUSTOM_THREADS
如果生成的目标文件无法满足要求,您可以根据需要进一步处理该文件(例如,创建共享库)。
当同一个覆盖率日志文件(.clog)被并行运行的多个插桩的二进制文件使用时,需要在运行时库中启用多进程支持。
要启用多进程支持,编译 cpptest.c
时将以下宏添加到编译命令行:"-DCPPTEST_MULTI_PROCESSES_LOG=1"
C/C++test 附带了一个简单的 Makefile(请参阅库源代码结构),可简化构建运行时库的过程。然而,在多数情况下不需要提供的 make 文件,因为源代码已经针对构建过程进行了优化。唯一一个始终需要执行的步骤是编译主要的 cpptest.c
源文件。对所产生的目标文件的任何额外处理都取决于特定的开发环境及要求,例如将运行时库作为共享库提供。
复制 <INSTALL_DIR>
/engine/coverage/runtime
到本地目录。
调用以下命令行创建包含单个对象 cpptest.<OBJ_EXT>
的 build
子目录,可用于链接插桩的应用程序。
make TARGET_CFG=<target config file name> CHANNEL_FILE=<channel config file name> |
您的命令行可能类似于:
make TARGET_CFG=gcc-static.mk CHANNEL_FILE=channel/unix-socket.mk |
或者,您可以提供通道类型:
make TARGET_CFG=gcc-static.mk CHANNEL_TYPE=unix-socket |
要设置覆盖率运行时库的用户构建,请执行以下步骤:
将 <INSTALL_DIR>
/engine/coverage/runtime/src/cpptest.c
中的 cpptest.c 文件复制到您的首选位置。
修改编译标志以包含编译器的 include 标志(通常使用 -I
),并使用以下值:-I <INSTALL_DIR>/engine/coverage/runtime/include
-D)
例如:-DCPPTEST_FILE_COMMUNICATION -DCPPTEST_NO_THREADS
如何显示包括错误和警告信息的覆盖率工作空间诊断数据?覆盖率工作空间保留了插桩代码和相应的静态覆盖率数据,以及进行代码插桩时生成的一些日志和配置文件。使用 默认情况下,将扫描位于当前目录中的覆盖率工作空间以获取诊断数据。您可以使用 -workspace 选项配置不同的工作空间位置。 示例
如何将覆盖率工作空间的诊断数据发送给 Parasoft 支持?您可以使用 默认情况下,将扫描位于当前目录中的覆盖率工作空间以获取诊断数据。您可以通过 -workspace 选项配置其他工作空间位置。 示例
如果在为应用程序覆盖率生成报告时找不到某个或多个源文件怎么办?生成覆盖率报告时,C/C++test 要求为代码覆盖率插桩的所有文件都能在原始位置找到。如果 C/C++test 在原始位置找不到文件,覆盖率报告就会不完整。在该情况下,C/C++test 会显示一条警告消息,包含缺少的文件列表。 若想要生成的覆盖率报告中包含已移动到其他位置的文件的覆盖率数据,则可以使用
可以在原始路径中使用允许的通配符“*”。例如:
还可以在列表文件(*.lst)中指定路径映射列表,并将其位置设置为值。例如:
*.lst 文件中的每一项都被视为一个单独的条目。 示例在下面的示例中,对 foo.cpp 文件进行覆盖率插桩并移动到其他位置。
生成包含 foo.cpp 文件覆盖率数据的覆盖率报告:
如果代码不能进行代码覆盖率插桩,如何使构建失败?默认情况下,当无法成功进行文件插桩时,将在构建中使用该文件的原始(未插桩)版本并显示警告。若要在某个或多个源文件无法进行覆盖率插桩时使构建失败,可使用 示例cpptestcc -disable-auto-recovery-mode [. . .] 如何收集构建期间经过多次编译的文件的覆盖率?默认情况下,C/C++test 会在一次构建中为每个源文件的一次编译存储覆盖率数据。因此,当出现一次构建中多次编译源文件的罕见情况时,C/C++test 仅存储该源文件最后一次编译的覆盖率数据。这可能会导致覆盖率报告不完整,并在生成报告时发出警告:“由于当前工作空间中缺少有关代码结构的某些信息,因此覆盖率报告可能不完整。”要为同一源文件存储覆盖率数据的多个变体(构建期间每次编译一个变体),可使用
示例cpptestcc -coverage-data-variants [. ..] |