本主题说明如何使用 C++test 执行运行时错误检测。本节包括:
运行时错误检测总览
C++test 的运行时错误检测使团队能够在单元或应用程序级别自动识别严重的运行时缺陷,例如内存泄漏、空指针、未初始化的内存和缓冲区溢出。 它适用于企业和嵌入式开发。
此功能的适应性使使用非标准内存分配模型(例如嵌入式系统)的团队可以进行运行时内存分析。由于用于该分析的仪器重量轻,因此可以在目标板,模拟器或主机上运行以进行嵌入式测试。
报告收集到的问题,并提供了解和解决问题所需的详细信息(包括内存块大小、数组索引、分配/取消分配堆栈跟踪等)。跟踪覆盖率指标以帮助您衡量并扩大测试范围。
在应用程序级别执行运行时错误检测
要对应用程序运行执行运行时错误检测:
运行【应用程序监视】组中的内置配置之一(例如, 应用程序监视> 使用内存监视构建并运行应用程序)。这些在 应用程序监视组中进行了描述。
C++test 将准备应用程序可执行文件的检测版本,然后运行它。根据所选的配置,C++test 将报告应用程序执行期间发现的覆盖率统计信息和/或内存错误。
重要的注意事项
对于内置于可执行文件中的项目,您可以使用运行时错误检测来监视应用程序的运行。要监视库项目,您需要为 C++test 目的向项目添加带有 'main()’ 函数定义(模拟使用被测试库的某些方案)的附加代码。例如,可以使用#ifdef PARASOFT_CPPTEST
防止将这样的 'main()’函数添加到一个经过测试的库源文件中。
在单元测试执行期间执行运行时错误检测
在单元测试执行期间执行运行时错误检测:
- 运行 “单元测试>使用内存监视运行单元测试” 测试配置。
C++test 将生成一个启用了运行时内存分析的测试可执行文件,然后执行测试。测试执行完成后,C++test 将报告与常规单元测试任务一起发现的内存问题。
在以下位置,每个运行时错误检测问题都被报告为违反给定规则(带有消息,位置和堆栈跟踪):
- GUI 中的 C++test 任务视图。
- GUI 中的代码编辑器。
- C++test 控制台(同时在 GUI 和 CLI 中运行)。
- 测试运行后生成的报告。
抑制运行时错误检测违规
可以像在静态分析冲突中一样抑制运行时错误检测冲突:在 GUI 或源代码中(// parasoft-suppress <ruleid> ["<reason>"]
)。
有关详细说明,请参见 抑制报告可接受的违规行为。
自定义运行时错误检测选项
您可以通过修改【测试配置】管理器的【执行】标签中的选项来自定义运行时错误检测。
在 执行>常规 选项卡中,您可以控制以下选项:
- 单元测试或应用程序监测分析模式:这确定在执行单元测试时是否应该执行运行时错误检测,或者是否应该构建和执行独立的应用程序(没有测试用例)。
- 对于应用程序监视模式,您可以(可选)指定应用程序二进制文件的位置/名称(测试应用程序二进制文件) 以及指定执行命令行(应用程序命令行)。
- 测试执行流程:
- 对于应用程序监视模式,您可以使用构建应用程序可执行文件或 构建和运行应用程序可执行文件测试执行流程。
- 对于单元测试模式,可以使用标准或自定义单元测试执行流程。有关详细信息,请参见自定义测试执行流。
- 检测方式:
- 对于应用程序监视模式,可以使用 应用程序完全监测, 应用程序内存监测或 应用程序覆盖率监测。
- 对于单元测试模式,可以将完整运行时与内存测一起使用。
在 执行>运行时间 选项卡中,您可以控制以下选项:
- 测试可执行文件的运行目录:对于单元测试和应用程序监视模式,这将确定在其中创建并应执行测试可执行文件的目录。如果在测试用例源或原始代码中使用了相对路径,则 C++test 将在此目录中搜索引用的文件。
运行时错误检测规则
C++ test 提供了以下运行时错误检测“规则”,这些规则在测试的代码中查找与内存相关的问题:
规则标识符 | 说明 |
---|---|
RUN-MEM-DANG | 不要使用悬空指针访问内存 该规则发现与使用指向已释放的内存的指针有关的问题。 |
RUN-MEM-WILD | 不要使用野指针访问内存 该规则发现与使用不指向有效内存缓冲区的指针有关的问题。 |
RUN-MEM-NULL | 不要使用空指针访问内存 该规则发现与使用空指针有关的问题。 |
RUN-MEM-RANGE | 不要使用超出范围的指针访问内存 该规则发现与访问超出范围的缓冲区有关的问题(例如访问 9 元素缓冲区的第 10 个元素)。 |
RUN-MEM-UNINIT | 不读取未初始化的内存 此规则发现与从已分配(但未初始化)的内存中读取有关的问题。 |
RUN-MEM-FREEDANG | 不要在悬空的指针上使用 free 该规则发现与尝试释放已经释放的内存指针有关的问题。 |
RUN-MEM-FREEIL | 不要在非法指针上使用 free 该规则发现与试图在未指向通过 malloc 分配的有效内存块的指针上使用 free 有关的问题。 |
RUN-MEM-FREELOC | 不要在本地内存指针上使用 free 该规则发现与试图在指向本地内存块的指针上使用 free 有关的问题。 |
RUN-MEM-FREEGLOB | 不要在全局内存指针上使用 free 该规则发现与试图在指向全局内存块的指针上使用 free 有关的问题。 |
RUN-MEM-FREENULL | 不要在空指针上使用 free 该规则发现与尝试对空指针使用 free 有关的问题。 |
RUN-MEM-MAZERO | 请勿使用大小等于 0 的 malloc 该规则发现与使用 malloc 分配零大小缓冲区有关的问题。 |
RUN-MEM-CAZEROELEM | 请勿使用大小等于 0 的 calloc 该规则发现与使用 calloc 分配零元素缓冲区有关的问题 |
RUN-MEM-CAZEROSIZE | 请勿使用元素大小等于 0 的 calloc 此规则发现与使用 calloc 分配零大小元素的缓冲区有关的问题。 |
RUN-MEM-RAILL | 不要对非法指针使用 realloc 该规则发现与在指针上使用 realloc 有关的问题,该指针未指向通过 malloc 分配的有效内存块。 |
RUN-MEM-RALOC | 不要在本地内存指针上使用 realloc 该规则发现与在指向本地内存块的指针上使用 realloc 有关的问题。 |
RUN-MEM-RAGLOB | 不要在全局内存指针上使用 realloc 该规则发现与在指向全局内存块的指针上使用 realloc 有关的问题。 |
RUN-MEM-RAZERO | 不要使用 new 大小等于 0 的 realloc 该规则发现与使用 realloc 分配零大小缓冲区有关的问题。 |
RUN-MEM-LEAK | 避免内存泄漏 此规则查找内存泄漏。当指向由 malloc/realloc/calloc 分配的内存的指针丢失时,它将报告一个问题。 |
RUN-MEM-CORRUPT | 避免内存损坏 此规则发现内存损坏。当在释放过程中意外地重写了分配有 malloc/realloc/calloc 的内存块时,它将报告一个问题。 |
运行时错误检测测试配置
有关可用测试配置的说明,请参见 内置测试配置。
我们建议您使用“使用...构建应用程序”如果要验证是否已准备好进行测试,请测试配置。如果构建的应用程序将在外部运行(例如,用于嵌入式测试),这些也是测试配置。在这种情况下,完整的流程包括构建,部署/运行(手动完成)和“读取日志”步骤。
“使用...构建和运行应用程序”当您希望 C++test 使用【测试配置】中指定的命令行构建并执行经过测试的应用程序时,应使用【测试配置】。
进一步来说:
- "...当您希望 C++test 对测试的应用程序执行运行时错误检测时,将使用“内存监测”配置。
- "...当您希望 C++test 从测试的应用程序运行中收集覆盖率信息时,将使用“覆盖率监测”配置。
- - "...当您要执行运行时错误检测以及收集覆盖率信息时,将使用“完全监测”配置。
运行时错误检测的已知限制
- 仅监视 C 样式的动态内存分配(使用 malloc(),calloc(),realloc())。
- 仅监视 C 样式的动态内存释放(使用 free())。
- 仅监视全局数组(不监视功能中定义的静态数组)。
- 与内存相关的操作必须直接在经过测试和检测的编译单元中进行,才能进行监视。
- C++ 模板中正在执行的与内存相关的操作不会受到监控,并且可能会影响结果。
- 外部库中正在执行的与内存相关的操作不会受到监控,并且可能会影响结果。
- 默认情况下,仅在【应用程序监视】模式下报告内存泄漏(RUN-MEM-LEAK)。