C/C++test报告空指针、未初始化变量或资源泄漏后,单看报错行往往不够,因为问题可能在几个函数之前就已经产生。处理C/C++test数据流路径怎么查看C/C++test数据流路径中断如何定位,需要沿着变量来源、条件分支和函数调用逐段检查,同时确认分析范围里没有漏掉关键源文件。
一、C/C++test数据流路径怎么查看
C/C++test的数据流路径属于Flow Analysis静态分析结果。它会模拟可能的程序执行过程,在不实际运行程序的情况下查找空指针解引用、除零、未初始化内存以及资源泄漏等问题。它与单元测试中的Path Coverage不是同一种路径,前者用于解释缺陷形成过程,后者用于统计测试执行过哪些控制流。
1、运行数据流分析配置
常见版本会提供Flow Analysis Fast、Standard和Aggressive等内置配置。日常检查可以从Standard开始,既能分析跨函数路径,也不会把时间一下拉得太长。
①在项目树中选择需要分析的项目或源码目录。
②进入【Parasoft】→【Test Using】。
③展开【Builtin】→【Static Analysis】。
④选择【Flow Analysis Standard】。
⑤等待分析完成并查看控制台信息。
如果分析范围只选了一个源文件,跨文件调用链可能无法完整建立。需要查看完整数据流时,尽量选中整个项目运行。
2、在Quality Tasks中打开路径
①进入【Parasoft】→【Show View】→【Quality Tasks】。
②展开本次静态分析结果。
③找到【Flow Analysis】或规则编号以BD开头的问题。
④双击目标问题。
⑤在代码编辑器和任务详情中查看路径节点。
数据流问题通常会显示问题产生位置、变量传递过程和最终违规点。逐个选择路径节点时,编辑器会跳转到对应文件和代码行。别一上来只看最后一行,真正需要修改的位置经常在路径前半段。
3、按照变量传播顺序阅读
一条典型路径可以拆成三个部分:
(1)原因位置:变量获得空值、未初始化值或异常范围的位置。
(2)传播位置:变量经过赋值、参数传递、返回值和条件分支的位置。
(3)违规位置:变量最终被解引用、计算或释放的位置。
例如,getBuffer()返回空指针,指针又经过两层函数参数传递,最后才在memcpy()中使用。报错点虽然在memcpy(),修复时却应检查最前面的返回值和空值处理逻辑。
4、在DTP中查看完整Trace
分析结果上传到Parasoft DTP后,也可以在网页中查看路径。
①打开DTP中的【Violations Explorer】。
②筛选对应项目、构建和规则。
③选中目标违规。
④打开详情区域的【Traces】。
⑤按顺序查看路径中的文件、函数和代码位置。
DTP收到C/C++test的Flow Analysis报告后,会在【Traces】中显示通往违规点的分析路径;较新工具上传的结果还可以包含额外路径注释。
二、C/C++test数据流路径中断如何定位
数据流路径停在某个函数调用处,并不一定代表工具出错。更常见的情况是函数实现不在分析范围、构建信息不完整,或者分析受到深度和超时限制。
1、检查中断点对应的函数
①打开路径中最后一个可见节点。
②记录该位置调用的函数名称。
③使用【Open Declaration】或【Open Definition】查找实现。
④确认实现文件是否属于当前工程。
⑤检查该文件是否参加了本次分析。
如果只能看到函数声明,找不到函数体,C/C++test无法继续分析其内部数据变化。第三方库、预编译库和只有头文件声明的接口都容易出现这种情况。
对于已知行为的外部函数,可以通过函数模型、资源分配与释放定义或空值检查方法设置,向Flow Analysis补充必要语义。官方文档也说明,分析范围外的方法返回行为未知时,可能产生不完整路径或误报。
2、检查分析范围是否过窄
①打开【Parasoft】→【Test Configurations】。
②选择当前使用的Flow Analysis配置。
③进入【Scope】页面。
④检查包含和排除规则。
⑤暂时改为完整项目范围重新分析。
限制分析范围能够缩短时间,但会影响依赖跨文件信息的规则。Parasoft明确提醒,执行路径分析在缺少被排除资源时,可能出现误报或漏报,因此应定期执行完整范围分析。
尤其要检查新增目录、自动生成代码和公共组件目录。有些过滤规则写得太宽,一条通配符就可能把整个调用链中间部分排除掉。
3、查看Flow Analysis超时信息
复杂循环、递归调用和大量分支会形成很多候选路径。为控制分析时间,Flow Analysis会使用分析深度和超时策略,达到限制后可能停止继续展开某个热点。
①生成本次静态分析报告。
②查看报告中的【Setup Problems】。
③搜索Flow Analysis、timeout或incomplete等信息。
④记录发生超时的文件和函数。
⑤复制当前配置后提高分析深度或超时限制。
Flow Analysis支持从较浅到较深的多个分析级别。深度提高后能够检查更长的跨函数路径,但分析时间和资源占用也会增加;超时情况会记录在报告的Setup Problems中。
不要直接把所有项目都改成最深级别。可以先针对问题模块增加深度,确认路径能否继续展开。
4、检查编译参数和构建数据
条件编译宏、包含目录或编译器配置不一致时,C/C++test看到的代码结构可能与正式构建不同。
①检查项目的【Build Settings】。
②确认编译器系列和实际工程一致。
③核对宏定义与头文件搜索路径。
④命令行分析时检查输入的BDF文件。
⑤重新采集构建数据后执行分析。
C/C++test依赖编译命令和构建数据确定源码、宏定义与包含关系。命令行模式可以通过构建跟踪生成BDF文件,再将其作为分析输入。
5、处理函数指针和动态分派
函数指针、回调、虚函数和复杂宏可能让调用目标难以唯一确定。
先查看中断位置是否属于这些结构,再确认实际候选函数是否都在工程中。调用目标明确但工具未能继续时,可以缩小测试代码,保留函数指针赋值和调用部分单独分析,这样更容易判断是工程配置问题,还是当前代码结构超出了可展开范围。
三、数据流路径恢复后怎么验证
路径能够完整显示后,还要判断它是否符合真实业务逻辑。静态分析会探索可能路径,其中一些条件在真实系统中可能受到外部约束。
1、逐段验证路径条件
①从路径起点开始查看变量取值。
②检查每个条件分支是否可能成立。
③核对外部函数的真实返回约定。
④确认错误处理是否会提前结束流程。
⑤查看违规点是否确实能够到达。
若路径依赖一个实际不可能出现的返回值,应补充函数模型或明确代码约束,别简单把结果删掉。路径确实成立时,则应在变量来源或进入危险操作前增加校验。
2、用小范围修改复查结果
修复后重新运行同一Flow Analysis配置,确认原问题消失,同时检查有没有出现新的调用路径。
还可以配合单元测试构造空指针、边界值和异常返回场景。Flow Analysis负责发现可能路径,测试负责证明具体输入下的程序行为,两边结合起来,定位会更扎实。
总结
处理C/C++test数据流路径怎么查看C/C++test数据流路径中断如何定位,关键是从问题原因一路看到最终违规点,并保证相关源码、编译参数和外部函数信息都在分析范围内。路径中断时,应优先检查最后一个函数调用、范围过滤和Setup Problems,再考虑调整分析深度。希望本文能为大家查看和排查C/C++test数据流路径提供参考,如需进一步了解相关内容,可联系咨询。