QAC扫描结果中,有些消息经过评审后可以按偏差处理。这时可以在源码中加入抑制注释。不过,注释写上了不代表列表里一定完全看不到消息。编号、位置、分析配置和结果筛选有一项没对上,复扫后仍可能继续显示。
一、QAC抑制注释怎么添加
QAC支持注释、Pragma、Dashboard和Baseline等多种抑制方式。源码中的抑制注释适合处理范围明确、已经确认可以接受的单条诊断。
1、先确认诊断消息编号
抑制注释填写的是QAC诊断消息编号,不能直接把MISRA规则号照搬进去。
①在【Analysis Results】→【Diagnostics】中选中目标消息。
②记录【ID】或消息编号。
③查看消息关联的规则和具体代码行。
④确认问题经过评审,确实需要抑制。
例如,界面显示消息编号为3200,注释中应填写3200。一个MISRA规则可能关联多条QAC消息,所以只看规则名称很容易填错。QAC结果面板会分别显示消息ID、严重级别、关联规则和代码位置。
2、添加单条消息抑制
常见的注释格式如下:
value=read_register();/*PRQA S 3200#已评审的硬件寄存器访问*/
也可以把注释放在对应语句前面:
/*PRQA S 3200#接口约束要求保留该类型转换*/
result=(uint16_t)raw_value;
①把注释放在产生诊断的语句附近。
②将3200替换成实际消息编号。
③在“#”后写明抑制原因或偏差记录编号。
④保存源码后重新分析该文件。
原因说明别只写“忽略”或“已确认”。写清硬件约束、第三方接口、生成代码或偏差单编号,后面复审会轻松很多。
3、抑制一段代码中的消息
同一段代码连续出现相同消息时,可以使用开启和关闭标记控制范围。
/*PRQA S 3200,4397++#第三方接口适配代码*/
legacy_api_call();
legacy_data_convert();
/*PRQA S 3200,4397--*/
①在目标代码前加入带【++】的抑制注释。
②填写需要抑制的消息编号。
③在代码段末尾加入对应的【--】注释。
④检查开始和结束标记是否成对。
⑤重新分析并查看抑制范围。
范围不要放得太大。为了处理两行旧代码,却把整个文件都压下去,后面新增的真实问题也可能被藏住。
4、检查注释是否被识别
复扫后可以让QAC显示已被抑制的诊断。注释抑制通常以橙色标记,这代表抑制已经生效,消息只是被设置为可见,并非仍处于活动状态。
命令行查看时,也可以输出注释抑制结果:
qacli view-P<项目目录>-m STDOUT-T COMMENT
QAC默认不输出已抑制消息;加入【COMMENT】筛选后,这些结果会重新显示,方便检查注释是否命中。
二、QAC抑制注释复扫后为什么仍然报错
复扫后还看到红色或黄色消息,先看它究竟是“未抑制”,还是“已抑制但被显示”。这两种情况处理方向差很多。
1、填写了规则号或错误消息号
①重新打开诊断详情。
②核对实际消息编号。
③检查编号前后是否多了字符或空格。
④一行出现多条消息时,分别填写对应编号。
例如,同一条转换语句可能同时触发类型、范围和MISRA合规消息。只抑制其中一个编号,其他消息依然会保留,这很正常。
2、注释位置没有覆盖诊断位置
QAC按照分析后的代码位置匹配抑制。注释距离目标语句太远、放进了错误的条件分支,或者【++】与【--】范围写反,都可能无法命中。
①查看诊断对应的准确行号。
②把单条注释移到该语句同一行或紧邻位置。
③检查代码是否经过宏展开。
④重新保存并分析。
别只看编辑器里“差不多在附近”。宏、条件编译和头文件展开后,QAC实际分析的位置可能和肉眼看到的不完全一样。
3、当前界面显示了已抑制消息
QAC可以主动显示【COMMENT】、【PRAGMA】、【BASELINE】等已抑制诊断。此时消息仍在列表中,但颜色和抑制类型已经变化。
①查看消息前是否标记【Comment suppression】。
②检查结果面板的抑制显示按钮。
③关闭【Show suppressed diagnostics】。
④对比【Active】与【Total】数量。
【Total】包含检测到的全部消息,【Active】才更接近当前仍需处理的结果。两者数量不同,往往说明部分消息已经被抑制。
4、文件没有重新完成分析
QAC默认只重新分析发生变化的文件及其依赖项。源码没保存、项目结果仍是旧状态,或者复扫只运行了部分组件,列表就可能继续保留原结果。
①保存加入注释后的源文件。
②对目标文件执行【Save and Analyze File】。
③仍未变化时清理该文件的分析结果。
④重新执行完整文件分析。
命令行需要彻底重跑时,可以使用:
qacli analyze-P<项目目录>--file-based-analysis--clean
该组合会先清理旧结果,再重新分析项目文件。
5、复扫使用了另一套配置
项目存在多个Configuration时,GUI、命令行和持续集成环境可能并未使用同一套配置。不同配置中的宏、RCF、CCT和文件范围不同,诊断位置也可能变化。
①查看当前激活的项目配置。
②核对本地与持续集成使用的配置名称。
③确认扫描的是同一分支和同一份源码。
④重新运行对应配置的分析。
命令行可以通过【--config】指定配置。未指定时,QAC会使用默认配置。
三、QAC抑制注释怎么管理更稳
抑制的目标是保留经过批准的偏差,同时让真正新增的问题继续暴露出来。注释越具体,后续维护越省事。
1、用抑制报告复核注释
①打开【Reports】。
②生成【Suppression Report】。
③检查已使用和未使用的抑制项。
④清理已经不再对应任何诊断的旧注释。
QAC的【Suppression Report】会汇总被抑制的诊断,还可以检查头文件中的未使用抑制。
2、旧项目优先考虑Baseline
遗留代码中有成百上千条已评审消息时,不建议往源码里塞满注释。可以建立Baseline,让后续分析重点显示新增加的问题。
Baseline会保存当时已有的诊断,并在后续分析中通过差异匹配继续抑制旧消息。它主要作用于结果查看,不会阻止分析器生成诊断。
总结
处理QAC抑制注释怎么添加QAC抑制注释复扫后为什么仍然报错,先核对消息编号和注释位置,再区分“仍在报错”与“已抑制但可见”。复扫没有变化时,还要检查文件保存、旧结果和项目配置。抑制原因写清楚,范围控制小一些,后续复审会省下不少时间。希望本文能为大家处理QAC抑制注释问题提供参考,如需进一步了解相关内容,可联系咨询。