想要搞懂QAC的分析结果怎么看,还有分析结果里的调用路径怎么定位,不能只盯着告警的总数量不放;QAC的静态分析结果,一般会按文件、消息等级、规则组、诊断信息这几个维度来展示,使用的人要先分清问题属于哪种类型,是违反了编码规则,是数据流出了问题,是跨模块带来的问题,还是项目配置不对引发的分析异常。Perforce的QAC官方文档里也写了,在图形界面里,可以通过Files、Message Levels、Rule Groups和Analysis Results/Diagnostics这些面板,来查看完整的分析内容。
一、QAC分析结果怎么看
看QAC的分析结果,要先看整体的分布情况,再去看单条的告警内容;直接从第一条问题就开始改代码,很容易陷进细节里出不来,到最后反而搞不清,哪些问题才是真的影响项目质量的。
1、先看结果是不是最新
打开对应的项目之后,要先检查文件的分析状态是不是有效的;如果文件已经被改过了,或是项目属性有比较大的变动,QAC的结果就可能被标记成过期的状态,这种时候还接着看旧结果,参考的价值就会下降不少。官方的快速入门资料里也提到,修改文件之后分析结果会变成过期状态,项目属性变了,也可能出现一样的情况。
2、再看告警分布
可以通过【Message Levels】和【Rule Groups】两个面板,查看告警按等级、组件和规则组的分布情况;Message Levels面板会按分析组件和消息级别统计结果,Rule Groups面板则更适合用来查看,哪些规则组出现了被违反的情况。相关文档里有说明,Message Levels面板会用树形的形式展示选中文件的消息,还会按组件做分组,比如qac、qacpp或是二级分析组件;这样就能先看清问题主要集中在哪一类,不用只盯着告警总数做判断。
3、单条结果要看代码位置和规则说明
在Analysis Results/Diagnostics面板里双击对应的消息,QAC就会打开对应的文件,还会把相关的代码行高亮出来;官方的说明里提到,双击诊断标记或者消息文本,就能在编辑器里打开文件,直接定位到受影响的代码位置。做这一步的时候,要同时看消息ID、规则编号、严重程度和代码的上下文,不能只看消息标题就下结论。
二、QAC分析结果里的调用路径怎么定位
调用路径一般是用来理解问题,怎么传递到当前代码位置的,尤其是数据流、函数调用和跨模块分析类的问题,都需要用到路径信息;定位问题的时候,不能只看最后一行的报错位置,要沿着路径往前找,找到问题的源头。
1、先展开子诊断信息
在【Analysis Results/Diagnostics】面板里找到要查看的目标告警,如果这条诊断带有子诊断内容,就要先把它展开;QAC的官方文档里提到,要是诊断包含子诊断项,就可以在结果的工具栏里,对它进行展开或是折叠的操作。这些子诊断往往能展示更细的上下文信息,比如问题从哪里开始出现,中间经过哪些调用点,在哪条语句上触发了告警;只看主诊断的话,很容易只看到最终的报错位置,看不到前面完整的传递链条。
2、按路径顺序回到代码
查看调用路径要顺着顺序一步步看,不能从最后一个节点就直接下判断;一般情况下,可以先看入口函数,再看中间的函数调用过程,最后再看触发告警的具体位置。比如空指针、变量未初始化或是数组越界这类风险,如果只看最后一行代码,可能会觉得是工具误报,但沿着调用链往前追溯,就可能会发现某个分支没完成赋值,或是某个参数没有经过合规检查。
3、跨文件问题要确认分析方式
要是调用路径涉及好几个源文件,就要先确认项目有没有开跨模块分析功能;QAC的相关文档里提到,基于文件的分析是在编译单元层面运行的,跨模块分析则会跨越编译单元的边界,检查重复定义、声明不兼容、变量未使用这类问题,而且跨模块分析要先完成基于文件的分析,才能正常运行。如果跨文件的信息不完整,调用路径就可能显示不全,或是只停在当前的编译单元内部。
三、QAC调用路径定位后怎么处理
找到完整的调用路径之后,不要急着把告警直接屏蔽掉;更稳妥的做法,是先判断这条路径在实际场景里是不是真的能成立,再决定是修改代码,补充初始化逻辑,增加条件判断,还是按流程申请规则偏离或是抑制告警。
1、确认路径是否可达
可以对照【函数入口】、【条件分支】和【参数来源】这几处信息,判断这条调用路径,在实际的业务场景里有没有可能发生;如果路径确实是可以走到的,就要优先修改对应的代码,如果路径依赖的条件根本不可能成立,也不能只简单说一句不会发生,要把具体原因说明白,比如调用方已经做了边界检查,参数来自固定的枚举值,或是这个函数只会在受控流程里被调用。
2、检查是否由配置不完整引起
有一些QAC的告警,并不是代码本身有问题,而是宏定义、头文件包含路径、编译选项或是目标平台配置不一致导致的;比如项目实际编译的时候启用了某个宏,但QAC的配置里没有同步加上,工具识别到的代码路径,就可能和真实构建的情况不一样。碰到调用路径明显不符合常理的情况,要先检查分析配置对不对,不要直接就去修改业务代码。
3、保留处理记录
如果问题已经修复完了,要记录好修改的位置,还有重新扫描的结果;如果判断为误报或是路径不可达,也要把对应的判断依据保存下来。QAC支持生成很多种类型的项目报告,比如代码评审报告、MISRA合规报告、规则合规报告、标准合规报告还有抑制报告等等,这些报告后续可以用在代码评审、合规审查和问题关闭的相关工作里。
总结
总的来说,看懂QAC的分析结果,定位好分析结果里的调用路径,重点是先确认结果处于有效状态,再按消息等级、规则组和诊断信息分层查看内容。单条告警要结合代码位置、规则说明和子诊断信息综合判断,调用路径则要从入口、参数传递、中间调用,一直追溯到触发告警的位置;如果路径涉及跨文件的内容,还要确认基于文件的分析和跨模块分析,是不是都已经完整执行。把问题定位清楚之后,再决定是修复代码、调整配置,还是按流程记录规则偏离,这样得到的处理结果,才会更可靠。