在嵌入式软件或大型C、C++项目中,只看单个函数内部的诊断信息,往往难以判断某段代码会被哪些模块调用,也不容易发现递归调用、跨文件依赖和影响范围。QAC可以基于已完成的分析结果生成函数调用与关联信息。了解QAC函数调用图怎么查看QAC函数调用图关系不完整怎么排查,有助于从单个函数继续追踪到整个项目的调用链路。
一、QAC函数调用图怎么查看
QAC中的函数调用关系通常通过代码审查报告查看。报告可以展示函数、文件和类的指标,并提供调用、包含关系及函数结构等代码可视化内容。
1、完成整个项目的文件分析
生成调用关系前,需要保证项目中的源文件已经完成分析。
①启动QA·GUI。
②点击【Project】→【Open Project】。
③选择需要查看的QAC项目。
④确认项目出现在【Files】面板中。
⑤点击【Analyze】。
⑥选择【File-based Analysis of Project】。
⑦等待项目分析完成。
⑧检查文件旁边是否显示绿色完成标记。
如果文件旁边出现时钟标记,说明源代码或项目配置发生了变化,当前结果已经过期。此时应重新执行分析,再生成调用图。
2、生成代码审查报告
①点击顶部【Report】菜单。
②选择【Generate Report for Project】。
③在【Report Generation】窗口中选择【CRR】。
④确认输出位置。
⑤保留【Open Report Location】。
⑥不要勾选【Ignore Dependencies】。
⑦点击【OK】开始生成报告。
⑧在自动打开的目录中打开代码审查报告。
如果只想查看部分文件,也可以先在【Files】面板中选中文件,再进入【Report】→【Generate Report for Selected Files】。不过这种方式只覆盖当前选择范围,不适合检查完整项目调用链。
3、查看函数调用关系
打开代码审查报告后,进入函数或文件对应的详情页面,查找【Calls】【Relations】等内容。
【Calls】主要用于查看当前函数调用了哪些函数,以及哪些函数与当前函数存在调用联系;【Relations】用于查看更广泛的代码关联;【Function Structure】展示的是函数内部控制流,两者不能混为一谈。
查看时可以从入口函数开始,逐级展开被调用函数,再返回上一级核对调用者。对于同名函数,还要结合源文件、命名空间、类名和参数信息判断是否为目标函数。
4、通过命令行生成报告
需要在持续集成环境中生成报告时,可以在项目目录执行:
qacli report-P.--type CRR
报告默认生成在当前配置对应的报告目录中。多配置项目应增加配置参数,确保生成报告所使用的配置与QA·GUI中查看的配置一致。
二、QAC函数调用图关系不完整怎么排查
调用图缺少函数或调用边时,常见原因包括分析结果过期、只分析了局部文件、跨文件分析未执行、编译配置不完整,以及代码中存在无法静态确定的间接调用。
1、检查是否生成了局部报告
①返回QA·GUI。
②查看生成报告时使用的菜单。
③确认选择的是【Generate Report for Project】。
④检查【Files】面板中是否只选中了少量文件。
⑤重新生成整个项目的【CRR】报告。
通过【Generate Report for Selected Files】生成的报告,只能反映选定文件及可获取到的相关信息。被调用函数位于未选文件中时,关系可能无法完整呈现。
2、重新执行完整分析
①点击【Analyze】→【Clean Project】。
②确认清理项目现有分析结果。
③再次进入【Analyze】。
④选择【File-based Analysis of Project】。
⑤等待所有文件重新分析完成。
⑥确认没有分析失败或过期标记。
⑦重新生成代码审查报告。
清理操作会删除当前项目的分析结果,因此应在确认项目配置正确后执行。重新分析能够避免报告继续读取旧源码对应的调用关系。
3、检查跨文件分析范围
文件分析主要以翻译单元为基础。调用者和被调用者位于不同项目或不同模块时,仅完成单项目文件分析,可能无法建立完整的跨模块关系。
①打开项目的分析工具链配置。
②确认跨模块分析组件已经加入。
③检查相关项目是否已加入同一个CMA方案。
④先完成各项目的文件分析。
⑤运行CMA分析。
⑥生成报告时选择对应的CMA方案。
⑦重新查看跨模块调用关系。
如果项目只启用了基础分析,或者分析时跳过了整体程序组件,跨翻译单元信息就可能缺失。命令行执行时,也要检查是否使用了跳过整体程序分析的参数。
4、核对项目同步和编译配置
①点击【Project】→【Project Properties】。
②检查当前配置使用的CCT。
③核对预处理宏、头文件目录和编译器选项。
④确认条件编译分支与实际构建一致。
⑤重新同步项目文件。
⑥再次运行完整分析。
宏定义不一致时,QAC看到的代码路径可能与真实构建不同。头文件缺失、类型声明解析失败或编译器兼容模板不匹配,也会导致部分函数定义和调用表达式无法正确关联。
5、判断是否属于间接调用
函数指针、回调函数、虚函数、多态调用和运行时注册机制,可能无法在静态分析阶段对应到单一目标函数。宏封装、汇编调用、外部库接口和动态加载代码也可能只显示调用位置,不显示完整目标关系。
遇到这类情况,应同时查看函数指针的赋值位置、回调注册函数和可能的目标函数集合。不能因为调用图没有画出唯一连线,就直接判断代码中不存在调用。
三、怎么确认函数调用关系已经恢复
完成配置调整和重新分析后,需要用固定入口函数进行前后核对,确认报告范围、分析状态和调用节点都已更新。
1、选择一个可验证的调用链
在源码中选择一组关系明确的函数,例如入口函数调用业务函数,业务函数再调用底层接口。记录三个函数所在文件和实际调用顺序,作为验证样本。
2、重新生成并核对报告
①确认所有相关文件显示分析完成。
②进入【Report】→【Generate Report for Project】。
③选择【CRR】并生成报告。
④打开入口函数的【Calls】信息。
⑤逐级检查业务函数和底层函数。
⑥反向检查被调用函数是否能关联到对应调用者。
如果同一调用链在源码中存在,而报告仍然缺少中间节点,应继续检查条件编译、函数指针和跨模块分析配置。
3、检查报告是否为草稿
生成报告时勾选【Ignore Dependencies】,可以绕过依赖检查,但报告可能被标记为草稿,内容也可能不完整。正式核对调用关系时,应取消该选项,并处理所有过期或失败的分析结果后重新生成报告。
总结
QAC函数调用图的完整程度,取决于源码范围、分析状态、编译配置和跨模块分析是否保持一致。处理QAC函数调用图怎么查看QAC函数调用图关系不完整怎么排查时,应先通过代码审查报告确认调用关系,再从局部报告、过期结果、项目同步和间接调用等方向逐项排查。调用图恢复后,还要选择真实代码链路进行正向和反向验证,才能确认分析结果已经能够反映当前项目结构。如有相关使用需求,欢迎联系咨询。