如何修改宏让Sonarqube忽略日志宏调用 避免认知复杂度评分虚高
日志宏导致Sonarqube认知复杂度虚高的解决方案
优先推荐使用方案1,无需修改业务代码,配置一次全局生效,维护成本最低。
方案1:配置Sonarqube规则直接忽略指定宏
- 进入Sonarqube控制台的质量配置板块,找到对应编程语言的认知复杂度检测规则(比如C/C++对应规则key为
c:CognitiveComplexity) - 在规则的忽略配置项中,填入你的日志宏名称,Sonar官方插件普遍支持自定义需要排除的函数/宏调用,配置完成后所有该宏的调用都不会被计入复杂度统计
方案2:全局配置行匹配规则忽略日志行
- 在项目根目录的
sonar-project.properties配置文件中添加如下配置:
# 定义多条件忽略规则 sonar.issue.ignore.multicriteria=ignore_log_complexity # 指定要忽略的规则为认知复杂度规则,替换为你对应语言的规则key sonar.issue.ignore.multicriteria.ignore_log_complexity.ruleKey=c:CognitiveComplexity # 生效范围为所有对应代码文件,可按需调整 sonar.issue.ignore.multicriteria.ignore_log_complexity.resourceKey=**/*.c # 行匹配规则,替换为你的日志宏前缀即可 sonar.issue.ignore.multicriteria.ignore_log_complexity.linePattern=^*LOG_.*
- 该方案同样不需要修改业务代码,仅需调整Sonar项目配置即可生效
方案3:修改宏定义自动携带NOSONAR标记(适用于C/C++)
- 利用预处理器先展开宏、后移除注释的执行顺序,将
//NOSONAR包装为宏内容,示例实现如下:
// 原日志宏定义 #define LOG_INFO(fmt, ...) printf("[INFO] %s: " fmt "\n", __func__, ##__VA_ARGS__) // 修改后自动携带NOSONAR标记的版本 #define SONAR_IGNORE //NOSONAR #define LOG_INFO(fmt, ...) printf("[INFO] %s: " fmt "\n", __func__, ##__VA_ARGS__) SONAR_IGNORE
- 宏展开后会自动在每一行日志调用末尾追加
//NOSONAR注释,可被Sonar正常识别,无需手动修改每个调用点
方案4:预处理脚本自动注入NOSONAR注释
- 如果你使用的编译流程支持自定义前置任务,可以编写简单的正则脚本,在预编译执行前扫描所有代码文件,匹配到日志宏调用行后自动在末尾追加
//NOSONAR注释 - 注意添加匹配逻辑跳过已经添加过NOSONAR的行,避免重复插入
内容的提问来源于stack exchange,提问作者turtlemcnuggets
相关产品推荐
相关产品推荐

