QAC分析C/C++代码时,会先按当前宏定义完成预处理。宏值一旦和真实编译环境不同,条件分支、类型声明和函数实现都会跟着变化。遇到“QAC预处理宏怎么配置QAC预处理宏导致分析结果异常怎么办”,先对照构建命令,再检查QAC实际生成的预处理结果。
一、QAC预处理宏怎么配置
项目宏、编译器内置宏和产品变体宏,来源并不相同。配置时最好沿用真实构建参数,少靠手工补写。
1、从实际构建中同步宏定义
QAC需要同时获取源文件、头文件路径和编译命令中的宏定义。例如编译参数里的-DMACRO=1,会影响当前源文件及其包含的头文件。
①打开QAC项目。
②进入【项目属性】→【同步设置】。
③确认已选择与实际编译器匹配的CCT。
④设置宏定义参数标识,如GCC的-D或MSVC的/D。
⑤执行一次完整清理构建。
⑥点击【项目】→【同步】,重新采集编译参数。
同步前要先清理工程。若项目已经是最新状态,构建过程没有真正调用编译器,QAC可能采集不到源文件、包含路径和宏定义。
2、通过构建日志导入宏
CI环境不方便直接监视构建时,可以把每个源文件的完整编译命令写入日志,再同步到QAC项目。
①生成包含源文件路径、-I和-D参数的构建日志。
②确认每条编译命令单独占一行。
③在命令行进入项目目录。
④执行以下命令:
qacli sync-P<项目目录>--type BUILD_LOG<日志文件>
⑤同步完成后检查项目文件数量。
⑥重新执行分析。
构建日志必须保留每个翻译单元自己的宏。只整理一份“公共宏列表”,很容易漏掉文件级参数和模块差异。
3、在CCT中补充编译器宏
编译器关键字、内置类型宏或特殊扩展无法从普通构建参数中取得时,可以在CCT生成脚本中加入额外定义。
常见形式包括:
-sd __interrupt=""
-sd _XKEYCHECK="1"
-sd __assume(a)=
空字符串、无值宏和函数式宏的写法不同,不能全按名称=值处理。CCT还会记录编译器行为、类型映射和附加头文件等信息。
①复制现有CCT或Auto CCT过滤脚本。
②补充缺少的编译器预定义宏。
③保留原始文件,不要直接覆盖。
④为新配置填写清楚的版本名称。
⑤将项目切换到新CCT。
⑥选择少量源文件进行测试分析。
项目功能开关尽量从构建命令同步。CCT更适合处理编译器本身固定存在的宏和语法扩展。
二、QAC预处理宏导致分析结果异常怎么办
宏配置异常常见表现是代码分支没有被分析、类型突然未定义、告警数量大幅变化,或者同一文件在本地与CI中结果不同。
1、检查宏名称和值
①打开出现异常的源文件。
②找到相关的#if、#ifdef和#elif。
③核对宏名称的大小写。
④检查宏值是0、1、空值还是未定义。
⑤确认命令行中没有重复定义。
⑥删除过期宏后重新同步。
FEATURE=0和没有定义FEATURE并不是同一种状态。代码使用#ifdef FEATURE时,即使值是0,该分支仍可能被选中。
2、排查构建变体混用
Debug、Release、不同芯片和不同产品版本,往往使用不同宏组合。把几套参数塞进同一个配置,分析结果很容易失真。
①列出各构建变体使用的宏。
②为不同变体建立独立QAC配置。
③分别同步对应构建命令。
④检查源文件是否属于当前变体。
⑤运行分析时明确选择配置。
多配置项目可通过--config指定分析配置;未指定时会使用默认配置。
3、检查带空格和引号的宏
函数式宏或字符串宏没有正确解析时,常会引发大面积语法错误。
①查看编译命令中的完整宏参数。
②核对括号、逗号和引号是否保留。
③检查【同步设置】中的引号解析方式。
④避免在脚本中重复转义。
⑤重新同步并只分析一份源文件。
例如/DMAX(A,B)="A
三、怎样确认QAC实际使用了正确的宏
界面里看到宏已填写,还不算完成。最直接的办法,是查看QAC展开后的预处理文件。
1、生成预处理源文件
①进入【分析】→【打开分析设置】。
②启用【为分析文件生成预处理源】。
③重新分析异常源文件。
④打开生成的.i文件。
⑤搜索关键宏对应的代码分支。
⑥与真实编译器的预处理结果进行比较。
命令行也可以执行:
qacli analyze-P<项目目录>-f--generate-preprocessed-source
生成文件通常位于项目配置对应的输出目录中。
2、修改配置后做干净分析
①保存新的宏和CCT配置。
②清理旧分析结果。
③重新同步工程。
④只分析一两个异常文件。
⑤确认结果正常后再跑全项目。
⑥比较修改前后的告警变化。
若解析器仍然失败,可以生成支持分析包,其中会包含预处理文件和本次分析选项,方便继续定位。
总结
“QAC预处理宏怎么配置QAC预处理宏导致分析结果异常怎么办”的关键,是让QAC看到的编译条件与真实构建保持一致。宏、包含路径和构建变体对齐后,很多莫名其妙的类型错误和告警波动都会消失。希望本文能为大家配置和排查QAC预处理环境提供参考,如需进一步了解相关内容,欢迎联系咨询。