排查变量异常时,搜索变量名往往只能找到一部分线索。数据传入另一个函数后,参数名称变了;经过临时变量或对象成员转存后,原名称也不再出现。处理“Understand如何追踪变量数据流Understand变量引用路径不完整如何排查”,可以从具体变量实体出发,把读写位置、赋值关系和函数调用结合起来看,再检查路径中断的位置。以下配置排查以C/C++项目为例。
一、Understand如何追踪变量数据流
追踪前先确认选中的是哪个变量。同名局部变量、类成员和全局对象属于不同实体,选错起点,后面的引用列表也会跟着偏离。
1、从变量定义确认查询对象
①在源码中选中变量,右键点击【View Information】,打开信息浏览器。
②核对定义文件、所在函数或类,以及变量类型,确认没有选中其他作用域中的同名对象。
③展开引用关系,点击具体记录跳转源码,区分赋初值、读取和修改的位置。
信息浏览器也可通过【View】→【Information Browser】打开。查到一处使用后,应继续核对实际传递的对象,不能只比较名称。
2、查看直接引用与数据流图
①右键变量,进入【Graphical Views】→【Object References】,查看直接设置、使用或修改该变量的函数。
②需要向来源追踪时,打开【Data Flow In】,沿设置或修改变量的函数继续查看相关对象。
③需要检查数据去向时,打开【Data Flow Out】,定位使用该对象值的后续关系。
④点击关键节点返回源码,核对赋值表达式、调用参数及分支条件。
这些图依据静态分析关系生成。节点之间存在联系,并不表示它们在某次运行中一定按图上的排列顺序执行。
3、沿赋值关系追踪名称变化
①返回【View Information】,展开【Assignments】和【Assigned To】,查看变量之间的赋值关系。
②遇到函数调用时,对照实参和形参,沿对应参数继续展开,检查数据进入函数后的使用位置。
③遇到临时变量或成员转存时,选中新对象,重新打开信息浏览器,继续检查。
例如,调用方的buffer传入函数后成为data,继续搜索buffer会漏掉函数内部的处理;此时应沿参数对应关系查找。
二、Understand变量引用路径不完整如何排查
先判断缺失发生在哪一层:源码没有进入项目、解析未成功,还是图形只展示了部分关系。调整图形显示无法补回数据库中没有建立的引用。
1、核对文件、头文件和宏配置
①进入【Project】→【Configure Project】→【Files】,检查相关实现文件、生成代码和目录是否已经加入,以及是否被排除。
②打开【Project】→【Improve Project Accuracy】→【Missing Includes】,补充实际构建使用的头文件搜索目录。
③通过【Undefined Macros】检查条件编译配置,对照目标构建设置宏及其值,不要为了显示所有分支而全部定义。
④完成配置后,执行【Project】→【Analyze All Files】,再查看分析错误与变量关系。
文件有独立编译条件时,可在【Files】中右键选择【Configure override settings】设置覆盖项。头文件存在,也要确认搜索顺序没有选中另一版本的同名文件。
2、检查解析模式和图形展示范围
①在【Project】→【Configure Project】的【C++】设置中核对解析模式。现代C++代码需要精确交叉引用时,应检查Strict模式及其所需构建信息。
②在【Violation Browser】中查看【Analysis Errors】,优先处理缺失头文件、未知类型等上游错误。
③打开图形工具栏的【Variant】,核对当前变体。例如【Relationship】只展示指定实体之间的关系,不能据此判断其他引用不存在。
④查看【Object References】的【With Called By】变体时,检查【Called By Depth】,适当增加调用者展开深度。
源码或配置修改后,也要确认重新分析已经完成。普通引用图只显示直接引用时,没有继续展开调用者可能属于图形设计,并非漏分析。
三、Understand如何核验路径中断的位置
配置修正后仍有断点,可以选一条具体语句逐步检查。把不同类型的数据传递分开验证,更容易判断是查询方式问题还是分析能力边界。
1、用直接赋值与复杂表达式对照
①选中直接赋值两侧的变量,分别打开【View Information】,检查【Assignments】和【Assigned To】。
②再选中包含计算的赋值结果,打开【Data Flow In】,结合源码查看参与计算的对象。
③记录没有形成预期连接的具体表达式,避免把赋值树中缺少一条边直接解释为没有数据依赖。
SciTools对assign引用的说明指出,简单变量赋值及实参到形参的传递可建立此类关系;复杂表达式不能一概按同样方式理解,应结合当前版本结果核验。
2、检查指针和间接调用两端
①在信息浏览器中打开参数与调用记录,核对传递的是数值、地址还是引用。
②从指针赋值、对象成员和被调用函数两端分别查询,确认中途是否换用了别名。
③遇到函数指针、回调或动态分派时,检查注册位置与可能的实现,再用【Graphical Views】查看相关函数关系。
④需要确认某次运行实际访问的对象时,结合调试器或测试记录验证,不把静态候选关系当作运行轨迹。
3、保留可重复检查的分析条件
①记录源代码提交、Understand版本、缺失路径两端的实体和对应文件位置。
②在副本项目中保留相关文件及编译条件,执行【Analyze All Files】,复查同一变量。
③重新打开【Object References】和信息浏览器,对照缺失位置;若问题仍能复现,整理最小代码范围、配置及分析错误记录,便于继续定位。
总结
处理“Understand如何追踪变量数据流Understand变量引用路径不完整如何排查”,可用的分析结论应能说明数据经过哪些对象、关键连接对应哪条源码,以及哪些间接关系还需要运行验证。这些信息比单独保存一张大图更便于复查,也能让接手人员知道下一步该检查哪里。希望以上操作能帮助大家缩小变量异常的调查范围,减少因同名对象、构建条件或图形展示范围造成的误判。如有Understand相关需求,欢迎与我们交流咨询。