Coverity 如何结合 GJB8114-2013使用?

5 阅读31分钟

一、Coverity 测试工具介绍

1.1 基础定义

Coverity 是新思科技(Synopsys Black Duck)旗下商用SAST静态源代码分析工具,源自斯坦福大学学术成果,无需运行程序,仅扫描源码即可提前挖掘代码缺陷、安全漏洞、编码合规问题,是航空、汽车、军工、嵌入式高安全领域主流代码测试工具。

简单理解:代码静态“CT体检仪”,属于白盒静态测试,不编译运行程序,就能发现运行期才会暴露的隐性Bug。

1.2 核心工作原理

  1. 源码解析:读取源码,构建抽象语法树AST、控制流图CFG;
  2. 跨函数数据流/污点传播分析:全局追踪变量、外部不可信输入(污点数据)全链路流转;
  3. 路径敏感符号执行:模拟所有分支、循环、异常执行路径,普通简单扫描工具仅做正则匹配,Coverity 支持深度跨文件、跨函数分析;
  4. 规则匹配:内置数千条检测规则,匹配缺陷并生成完整问题链路证据;
  5. 缺陷分级+报告输出:区分误报,给出代码行、根因、修复方案。

1.3 支持编程语言与场景

1.3.1 支持语言

支持22+种编程语言,C/C++ 为核心优势,同时包含 Java、C#、Python、JS/TS、Go、Swift、Kotlin、PHP、Objective-C、Ruby 等。

1.3.2 核心适用行业

军工/航电(DO-178C)、汽车电子(ISO 26262、MISRA)、工业控制、医疗设备、金融高安全系统、大型后端、嵌入式底层系统。

1.4 三大核心检测能力

1.4.1 运行时致命代码缺陷(嵌入式重点)

内存类:内存泄漏、缓冲区溢出、数组越界、野指针、空指针解引用、未初始化变量; 资源类:文件句柄/套接字/数据库连接未释放; 并发类:死锁、多线程数据竞争; 运算类:整数溢出、符号转换错误、除零风险; 逻辑类:死代码、函数返回值未校验、拷贝错误等。

1.4.2 网络安全漏洞

覆盖 OWASP Top10、CWE 标准,可检测 SQL注入、XSS跨站、硬编码密钥、不安全反序列化、路径遍历等高危漏洞。

1.4.3 行业编码合规检查

原生支持 MISRA C/C++、CERT C/C++、DO-178、ISO 2626、国军标等行业编码规范,可自定义拓展行业规则。

1.5 工具组成模块

  1. cov-analyze 扫描引擎:核心分析程序,对接 Make/CMake/Keil 等编译工具;
  2. Coverity Connect:Web管理平台,用于项目管理、缺陷流转、审计、报表导出;
  3. Code Sight IDE插件:VS Code/Eclipse/VS 实时编码检测;
  4. CI/CD集成插件:Jenkins/GitLab 流水线自动扫描、门禁拦截。

1.6 核心优势 & 对比

1.6.1 核心优势

  1. 极低误报率,深度数据流分析优于普通正则扫描工具;
  2. C/C++ 嵌入式分析能力行业顶尖;
  3. 完整缺陷追溯、基线、审计能力,适配军工/车载合规要求;
  4. 支持增量扫描,大型代码库效率高;
  5. 支持私有化离线部署,适配涉密场景。

1.6.2 同类工具区分

  • Coverity:主打嵌入式、军工、汽车,侧重内存/并发/国军标合规;
  • SonarQube:开源为主,侧重代码风格、Web漏洞,嵌入式能力弱;
  • Klocwork:同嵌入式赛道,汽车领域使用较多;
  • Fortify:Web安全漏洞更强,底层C/C++分析偏弱。

1.7 工具局限

  1. 必须捕获完整编译过程,无法直接扫描零散源码;
  2. 商业收费,无完整免费版本;
  3. 交叉编译场景需要额外适配编译器。

二、GJB8114-2013 《C/C++语言编程安全子集》标准概述

2.1 标准基础信息

  • 标准编号:GJB 8114-2013
  • 发布时间:2013-07-10,实施时间:2013-10-01
  • 适用范围:军用安全关键C/C++软件,其他军用软件可参照执行
  • 规则分类:强制准则(必须遵守)、建议准则(推荐遵守)

2.2 标准整体结构

  1. 通用部分:范围、引用文件、术语、总则;
  2. C/C++ 共用准则(5大模块):声明定义、版面书写、指针、分支、跳转、运算、函数、循环、类型转换、初始化、比较、变量等;
  3. C++ 专用准则:类、构造/析构、虚函数、类型转换、内存、异常、模板等;
  4. 评价规范:缺陷统计、违背率计算、等级划分;
  5. 附录:规则索引、评价示例。

2.3 评价规则(核心审计要求)

2.3.1 计算公式

  • NN:软件总语句行数
  • LL:所有强制准则违背总行数
  • 违背率 P=LN×1000‰P = \frac{L}{N} \times 1000‰

2.3.2 评价等级

违背率范围评价结论
P≤3‰P \le 3‰非常好
3‰<P≤20‰3‰ < P \le 20‰好
20‰<P≤40‰20‰ < P \le 40‰较好
40‰<P≤60‰40‰ < P \le 60‰较差
60‰<P≤100‰60‰ < P \le 100‰差
P>100‰P > 100‰非常差

各项目可根据实际需求微调区间。


三、Coverity 与 GJB8114-2013 融合落地方案

Coverity 无官方预置GJB8114规则包,依托自定义规则、编译适配、平台管控、流水线集成能力,实现国军标全量落地,构建「缺陷检测+国军标合规」一体化体系。

3.1 规则能力分层匹配

3.1.1 原生复用(无需开发)

GJB8114大量规则与 Coverity 内置 MISRA / CERT 规则重合,直接启用: 指针、内存、数组越界、除零、函数签名、头文件保护、gets禁用、内存泄漏等。

3.1.2 配置开关(简单适配)

修改工具阈值/开关即可实现: 代码行数限制、函数行数限制、分支嵌套层数、无限循环管控、注释规范等。

3.1.3 自定义规则(军工特有)

GJB8114独有规则,需基于 Coverity 编码标准/自定义检查器开发: 宏管控、位域规则、变量命名、switch严格规范、C++菱形继承/异常规则等。

3.2 步骤1:搭建 GJB8114 专属规则集

3.2.1 规则文件路径

Coverity 规则根目录:$COVERITY_HOME/config/coding-standards/

  1. 复制现有标准模板(如misrac2012),重命名为gjb8114_2013;
  2. 核心文件:
    • config.xml:规则总开关、告警等级;
    • rules/:单条规则定义;
    • messages/:告警文案(绑定GJB8114编号+原文)。

3.2.2 规则开发规范

  1. 规则ID命名:gjb8114_规则编号(例:gjb8114_R_1_1_1);
  2. 等级划分:强制准则=Error(阻断)、建议准则=Warning(提醒);
  3. 告警内容:必须标注GJB8114准则编号、规则原文;
  4. 测试要求:基于标准内「违背/遵循示例」完成漏报、误报验证,输出工具能力确认报告。

3.2.3 简易规则示例

<!-- 示例:R-1-9-4 禁止for(;;)无限循环 -->
<rule id="gjb8114_R_1_9_4" severity="error" category="GJB8114-循环控制">
  <description>GJB8114 R-1-9-4:无限循环必须使用while(1),禁止for(;;)</description>
  <pattern>for\s*\(\s*;\s*\)</pattern>
  <message>违背GJB8114强制准则R-1-9-4:禁用for(;;),请使用while(1)</message>
</rule>

3.3 步骤2:扫描编译配置(嵌入式/交叉编译适配)

3.3.1 标准扫描命令

# 1. 捕获编译过程
cov-build --dir cov-int make

# 2. 执行分析,加载GJB8114规则集
cov-analyze --dir cov-int --coding-standard gjb8114_2013 --enable-all --timeout 3600

# 3. 上传结果至Coverity Connect
cov-commit-defects --dir cov-int --host 内网地址 --stream 项目名

3.3.2 嵌入式专项配置

  1. 指定交叉编译器:cov-configure --compiler arm-linux-gcc;
  2. 拦截头文件绝对路径;
  3. 关闭编译器非标准扩展,适配位域、结构体对齐规则。

3.4 步骤3:Coverity Connect 平台适配

  1. 项目规划:按型号/模块创建独立Stream,绑定GJB8114规则集;
  2. 自定义字段:新增「GJB8114规则编号、规则类型、违背行数、整改状态」;
  3. 基线&豁免:存量问题纳入基线,强制准则豁免必须附审批单;
  4. 权限管控:按角色分配权限(开发/测试/管理员),适配涉密要求。

3.5 步骤4:CI/CD 流水线自动化门禁

3.5.1 流水线流程

代码提交 → 编译构建 → Coverity增量扫描 → 合规门禁 → 代码合入

3.5.2 门禁策略

  1. 强制准则(Error):直接阻断代码合入;
  2. 建议准则(Warning):仅记录,限期整改;
  3. 禁止新增基线外违规项。

3.5.3 Jenkins 脚本示例

stage('GJB8114 代码合规检测') {
  steps {
    sh 'cov-build --dir cov-int make'
    sh 'cov-analyze --dir cov-int --coding-standard gjb8114_2013'
    script {
      def errorNum = sh(script: 'cov-format-errors --dir cov-int | grep "GJB8114-R" | wc -l', returnStdout).toInteger()
      if(errorNum > 0) {
        error "代码违背GJB8114强制准则,禁止合入!"
      }
    }
  }
}

3.6 步骤5:统计评价与报表输出

  1. 从Coverity导出CSV/Excel报告,提取总行数N、违背行数L;
  2. 计算违背率,对照标准生成评价结论;
  3. 标准交付报表:基础信息、违规清单、统计结果、附件(日志/审批单)。

3.7 步骤6:IDE 本地检测

部署 Coverity Code Sight 插件(VS Code/Eclipse),本地编码时实时提示GJB8114违规,提前整改。

3.8 分阶段落地计划

  1. 试点阶段(1-2周):选取小模块,完成规则开发、用例测试;
  2. 集成阶段(2-3周):平台配置+流水线接入,全员培训;
  3. 常态化运维(长期):全项目推广,按月输出合规报告,定期迭代规则。

3.9 常见问题优化

  1. 误报/漏报:补充测试用例,特殊场景配置审批白名单;
  2. 扫描缓慢:开启增量扫描、模块并行分析;
  3. 涉密环境:全内网离线部署,数据本地存储备份。

四、GJB8114-2013 与 Coverity 完整规则映射表

说明

  • 适配类型:原生复用/配置开关/自定义规则
  • 级别:强制(R)=Error、建议(A)=Warning

4.1 C/C++ 共用准则

4.1.1 5.1 声明定义(R-1-1 / A-1-1 系列)

准则编号规则内容级别适配类型实现要点 & Coverity配置
R-1-1-1禁止宏改变关键字、基本类型含义强制自定义规则正则/AST匹配#define目标为int/long/char等关键字
R-1-1-2禁止宏定义为关键字/基本类型强制自定义规则检测#define 别名 关键字场景
R-1-1-3typedef 类型禁止重定义强制原生复用启用MISRA类型重定义检查
R-1-1-4禁止重新定义C/C++关键字强制自定义规则检测标识符与关键字重名
R-1-1-5#define 禁止重复定义强制原生复用启用预处理重复宏检查,保留#undef后重定义豁免
R-1-1-6函数内#define / #undef 必须配对强制自定义规则函数作用域内宏成对校验
R-1-1-7函数式宏参数、结果必须加括号强制原生复用启用CERT宏安全规则
R-1-1-8结构体/联合/枚举必须定义标识名强制自定义规则AST检测无名struct/union/enum
R-1-1-9结构体禁止嵌套无名结构体强制自定义规则递归检测内部无名子结构
R-1-1-10有符号位域位长必须>1强制自定义规则拦截signed 类型 : 1
R-1-1-11位域必须显式指定有/无符号强制原生复用启用MISRA位域规则
R-1-1-12位域类型统一、不跨类型长度强制自定义规则校验位域基础类型与位总长
R-1-1-13函数声明必须带参数类型+变量名强制原生复用启用严格函数原型检查
R-1-1-14函数声明与原型完全一致强制原生复用函数签名全量校验
R-1-1-15函数形参必须显式声明类型强制原生复用禁用K&R旧式函数定义
R-1-1-16外部变量声明与定义类型一致强制原生复用跨文件变量类型校验
R-1-1-17禁止函数体内写extern声明强制自定义规则检测函数内部extern语句
R-1-1-18数组必须显式指定长度强制自定义规则拦截int arr[]无界数组定义
R-1-1-19extern 变量禁止初始化强制原生复用外部变量初始化检查
R-1-1-20数值用char必须显式有/无符号强制原生复用启用CERT char符号检查
R-1-1-21#include 禁止使用绝对路径强制自定义规则正则拦截盘符绝对路径
R-1-1-22禁止头文件重复包含强制原生复用头文件保护检查
R-1-1-23空参数函数必须写 void强制原生复用禁用fun(),强制fun(void)
A-1-1-1建议用typedef封装基础类型建议配置开关统计原生基础类型使用量
A-1-1-2谨慎宏括号不匹配建议原生复用宏语法告警增强
A-1-1-3谨慎使用#、##宏运算符建议配置开关宏拼接/字符串化告警
A-1-1-4函数变量统一在头部定义建议配置开关检测行内变量定义
A-1-1-5结构体嵌套不超3层建议配置开关嵌套层数阈值=3
A-1-1-6建议宏/const定义常量建议配置开关魔法数字告警

4.1.2 5.2 版面书写(R-1-2 / A-1-2 系列)

准则编号规则内容级别适配类型实现要点 & Coverity配置
R-1-2-1循环体必须加大括号强制配置开关强制for/while单语句带{}
R-1-2-2if/else if/else 必须加大括号强制配置开关强制分支单语句带{}
R-1-2-3头文件前禁止可执行代码强制自定义规则检测#include之前存在执行语句
R-1-2-4歧义逻辑表达式必须加括号强制原生复用运算符优先级告警
R-1-2-5位运算、逻辑运算项必须加括号强制原生复用混合运算括号检查
R-1-2-6禁止嵌套注释强制原生复用注释语法检查
A-1-2-1单文件语句≤2000行建议配置开关文件行数阈值=2000
A-1-2-2单函数语句≤200行建议配置开关函数行数阈值=200
A-1-2-3C谨慎使用//注释建议配置开关C文件//注释告警

4.1.3 5.3 指针使用(R-1-3 / A-1-3 系列)

准则编号规则内容级别适配类型实现要点 & Coverity配置
R-1-3-1指针级数不超过两级(***禁用)强制自定义规则统计指针层级,拦截三级及以上
R-1-3-2函数指针取值必须加&强制自定义规则函数指针赋值缺少&告警
R-1-3-3禁止对入参指针直接赋值强制自定义规则函数内修改形参指针地址
R-1-3-4禁止返回局部变量地址强制原生复用高危内存检查
R-1-3-5禁止使用/重复释放野指针强制原生复用野指针、重复free检查
R-1-3-6指针free后必须置NULL强制自定义规则free后未赋值NULL告警
R-1-3-7动态指针定义时初始化为NULL强制自定义规则未初始化动态指针告警
R-1-3-8动态指针使用前判NULL强制原生复用空指针解引用前置检查
R-1-3-9空指针统一使用NULL,不用0强制自定义规则拦截指针判断==0/!=0
R-1-3-10文件指针使用完毕必须fclose强制原生复用文件句柄泄漏检查
A-1-3-1谨慎使用函数指针建议配置开关函数指针使用告警
A-1-3-2谨慎使用void*无类型指针建议原生复用通用指针告警
A-1-3-3谨慎指针算术运算建议配置开关指针加减运算告警

4.1.4 5.4 分支控制(R-1-4 / A-1-4 系列)

准则编号规则内容级别适配类型实现要点 & Coverity配置
R-1-4-1if-else if 链必须补else强制自定义规则分支完整性检查
R-1-4-2空分支必须写;/* no deal with */强制自定义规则空语句+固定注释校验
R-1-4-3禁止空switch语句强制自定义规则拦截switch(){}
R-1-4-4禁止对bool量使用switch强制自定义规则switch表达式为布尔值告警
R-1-4-5switch 不能只有default强制自定义规则仅含default的switch告警
R-1-4-6switch 除完整枚举外必须有default强制原生复用switch完整性检查
R-1-4-7case/default 必须break/return;共用case加注释强制原生复用switch穿透检查,补充注释校验
R-1-4-8switch 分支层级统一,禁止内嵌case强制自定义规则检测if内部嵌套case
A-1-4-1分支嵌套最多7层建议配置开关嵌套层数阈值=7

4.1.5 5.5 跳转控制(R-1-5 / A-1-5 系列)

准则编号规则内容级别适配类型实现要点 & Coverity配置
R-1-5-1禁止跨复合语句、向上goto强制自定义规则作用域+数据流分析管控goto
R-1-5-2禁止使用setjmp/longjmp强制原生复用直接拦截函数调用
A-1-5-1谨慎使用goto建议配置开关goto通用告警

4.1.6 5.6 运算处理(R-1-6 / A-1-6 系列)

准则编号规则内容级别适配类型实现要点 & Coverity配置
R-1-6-1浮点常数禁止直接赋给整型强制原生复用隐式浮点转整型检查
R-1-6-2禁止赋值越界整数强制原生复用数值溢出检查
R-1-6-3逻辑表达式内禁止赋值强制原生复用拦截if(a=b)写法
R-1-6-4逻辑量禁止做位运算强制自定义规则逻辑表达式执行位运算告警
R-1-6-5表达式/函数参数禁止使用++/--强制自定义规则复合表达式内自增自减拦截
R-1-6-6移位位数不超过变量位长强制原生复用移位溢出检查
R-1-6-7移位位数不能为负数强制原生复用移位操作数符号检查
R-1-6-8数组禁止越界访问强制原生复用数组/缓冲区越界检查
R-1-6-9数组下标≥0强制原生复用负数下标拦截
R-1-6-10禁止对常量做!逻辑非强制自定义规则拦截!1 / !0
R-1-6-11非枚举变量禁止使用枚举值强制自定义规则枚举类型匹配校验
R-1-6-12禁止除零、取模零强制原生复用除零风险检测
R-1-6-13sizeof 内部禁止赋值强制自定义规则拦截sizeof(赋值表达式)
R-1-6-14缓冲区读取不越界强制原生复用memcpy等读取长度检查
R-1-6-15缓冲区写入不越界强制原生复用memcpy等写入长度检查
R-1-6-16禁止使用已释放内存强制原生复用悬挂指针检查
R-1-6-17free 必须使用原始指针强制自定义规则指针偏移后free告警
R-1-6-18禁用gets,强制fgets强制原生复用直接拦截gets调用
R-1-6-19字符串拷贝/追加目标不越界强制原生复用strncpy/strncat长度校验
A-1-6-1谨慎有符号数位运算建议配置开关有符号数位运算告警
A-1-6-2谨慎整型除法建议配置开关整除风险告警
A-1-6-3动态内存及时释放建议原生复用内存泄漏增强检查
A-1-6-4建议用strncpy替代strcpy建议配置开关strcpy调用告警
A-1-6-5建议用strncat替代strcat建议配置开关strcat调用告警
A-1-6-6谨慎逗号运算符建议配置开关逗号表达式告警

4.1.7 5.7 函数调用(R-1-7 / A-1-7 系列)

准则编号规则内容级别适配类型实现要点 & Coverity配置
R-1-7-1禁止重写标准库函数强制原生复用标准函数重定义检查
R-1-7-2实参与形参类型一致强制原生复用参数类型匹配
R-1-7-3实参、形参个数一致强制原生复用参数个数校验
R-1-7-4禁用旧式K&R函数定义强制原生复用旧式语法拦截
R-1-7-5声明与定义参数类型一致强制原生复用跨文件函数签名校验
R-1-7-6声明与定义返回值一致强制原生复用返回值类型校验
R-1-7-7有返回值函数必须return强制原生复用缺失返回语句检查
R-1-7-8无返回值函数return不带值强制原生复用void函数返回值拦截
R-1-7-9有返回值return必须带值强制原生复用空return拦截
R-1-7-10返回值类型与定义匹配强制原生复用返回值类型校验
R-1-7-11弃用返回值必须加(void)强制自定义规则无(void)丢弃返回值告警
R-1-7-12void函数调用禁止加(void)强制自定义规则多余(void)拦截
R-1-7-13静态函数必须被调用强制原生复用未使用静态函数检查
R-1-7-14同一表达式不调用顺序相关函数强制自定义规则多副作用函数同表达式告警
R-1-7-15函数参数禁止使用省略号...强制自定义规则拦截可变参数列表
R-1-7-16禁止直接/间接递归强制原生复用递归调用检测
A-1-7-1函数参数≤10个建议配置开关参数个数阈值=10
A-1-7-2避免未使用参数建议原生复用无用形参检查
A-1-7-3谨慎使用abort/exit建议配置开关进程退出函数告警
A-1-7-4系统函数校验返回值建议原生复用返回值未判断告警
A-1-7-5数组传参建议同步传长度建议配置开关数组无长度告警

4.1.8 5.8 语句使用(R-1-8 / A-1-8 系列)

准则编号规则内容级别适配类型实现要点 & Coverity配置
R-1-8-1禁止不可达语句强制原生复用死代码检测
R-1-8-2禁止不可达分支强制原生复用永真/永假分支检测
R-1-8-3禁止无效语句强制自定义规则无意义表达式告警
R-1-8-4八进制常量必须加/octal/注释强制自定义规则八进制数注释校验
R-1-8-5数值后缀统一使用大写强制自定义规则拦截u/l/f小写后缀
A-1-8-1避免空语句建议配置开关单独分号告警
A-1-8-2避免无用变量建议原生复用未使用变量检查
A-1-8-3避免无用函数建议原生复用未使用函数检查
A-1-8-4推荐使用大写数值后缀建议同R-1-8-5

4.1.9 5.9 循环控制(R-1-9 / A-1-9 系列)

准则编号规则内容级别适配类型实现要点 & Coverity配置
R-1-9-1for循环变量必须是局部变量强制自定义规则全局/静态循环变量告警
R-1-9-2for循环变量必须为整型强制自定义规则浮点循环变量拦截
R-1-9-3循环体内禁止修改循环变量强制自定义规则循环内修改控制变量告警
R-1-9-4无限循环仅允许while(1),禁用for(;;)强制自定义规则拦截for(;;)
A-1-9-1谨慎使用无限循环建议配置开关while(1)告警
A-1-9-2循环内少用break建议配置开关多break告警
A-1-9-3循环内少用continue建议配置开关多continue告警

4.1.10 5.10 类型转换(R-1-10 / A-1-10 系列)

准则编号规则内容级别适配类型实现要点 & Coverity配置
R-1-10-1浮点转整型必须强转强制原生复用隐式转换拦截
R-1-10-2长整型转短整型必须强转强制原生复用不同长度整型隐式转换拦截
R-1-10-3double转float必须强转强制原生复用双精度转单精度隐式转换拦截
R-1-10-4指针赋值类型必须一致强制原生复用指针类型不匹配检查
R-1-10-5指针与普通变量互转必须强转强制原生复用地址/数值隐式互转拦截
R-1-10-6禁止无意义多层强转强制自定义规则冗余转换告警
A-1-10-1浮点转整型考虑四舍五入建议配置开关浮点截断告警
A-1-10-2谨慎double转float建议原生复用精度丢失告警
A-1-10-3谨慎长整型转短整型建议原生复用数据截断告警
A-1-10-4谨慎指针与数值互转建议原生复用地址转换告警

4.1.11 5.11 初始化(R-1-11 / A-1-11 系列)

准则编号规则内容级别适配类型实现要点 & Coverity配置
R-1-11-1变量使用前必须赋值强制原生复用未初始化变量检查
R-1-11-2不依赖系统默认初始化强制自定义规则全局/静态变量手动初始化校验
R-1-11-3嵌套结构体初始化格式匹配强制自定义规则初始化花括号层级校验
R-1-11-4枚举初始化完整强制自定义规则枚举元素初始化规则校验
A-1-11-1声明同时初始化变量建议配置开关声明赋值分离告警
A-1-11-2全局变量统一模块初始化建议配置开关分散初始化告警

4.1.12 5.12 比较判断(R-1-12 / A-1-12 系列)

准则编号规则内容级别适配类型实现要点 & Coverity配置
R-1-12-1逻辑量禁止> / <比较强制自定义规则布尔值大小比较拦截
R-1-12-2指针禁止> / <比较强制原生复用指针大小比较告警
R-1-12-3浮点数禁止== / !=判断强制原生复用浮点等值判断拦截
R-1-12-4无符号数禁止判正负强制自定义规则拦截unsigned x >=0 / x <0
R-1-12-5有/无符号数禁止直接比较强制原生复用混合符号比较告警
A-1-12-1常量写在比较符左侧建议配置开关变量==常量写法告警

4.1.13 5.13 变量使用(R-1-13 / A-1-13 系列)

准则编号规则内容级别适配类型实现要点 & Coverity配置
R-1-13-1局部变量不与全局重名强制自定义规则作用域变量重名检查
R-1-13-2形参不与全局重名强制自定义规则形参/全局变量重名
R-1-13-3变量名不与函数名重名强制自定义规则标识符重名校验
R-1-13-4变量名不与结构体/联合体名重名强制自定义规则类型名与变量重名
R-1-13-5变量名不与枚举元素重名强制自定义规则枚举项与变量重名
R-1-13-6变量名不与typedef类型重名强制自定义规则自定义类型与变量重名
R-1-13-7代码块内不重定义外层变量强制自定义规则变量遮蔽告警
R-1-13-8不依靠大小写区分变量强制自定义规则近似大小写变量告警
R-1-13-9不区分 l/1 命名变量强制自定义规则l与数字1混淆命名拦截
R-1-13-10不区分 O/0 命名变量强制自定义规则O与数字0混淆命名拦截
R-1-13-11禁止单独用 l / O 作为变量名强制自定义规则单字符l/O变量拦截
R-1-13-12外部可修改变量加volatile强制原生复用共享/寄存器变量校验
R-1-13-13表达式不重复使用同一volatile强制自定义规则多次读取volatile告警
R-1-13-14NULL 不当作整型0使用强制自定义规则NULL作为数字传参拦截
R-1-13-15无符号变量禁止赋负值强制原生复用负值赋值给unsigned拦截
R-1-13-16字符串数组必须以\0结尾强制原生复用字符串结束符检查
A-1-13-1推荐类型前缀命名建议配置开关命名规范度量告警
A-1-13-2谨慎使用register变量建议配置开关register关键字告警

4.2 C++ 专用准则

4.2.1 6.1 类与对象(R-2-1 / A-2-1 系列)

准则编号规则内容级别适配类型实现要点 & Coverity配置
R-2-1-1含动态成员的类必须实现拷贝构造、赋值重载强制自定义检查器AST分析动态成员与拷贝函数
R-2-1-2虚基类转派生类必须用dynamic_cast强制原生复用C++类型转换规则增强
R-2-1-3菱形继承基类必须virtual强制自定义检查器菱形继承结构校验
R-2-1-4抽象类拷贝运算符设为protected/private强制自定义检查器抽象类权限检查
A-2-1-1谨慎虚基类派生建议配置开关virtual基类告警
A-2-1-2谨慎内联函数建议配置开关复杂inline函数告警

4.2.2 6.2 构造函数(R-2-2 系列)

准则编号规则内容级别适配类型实现要点 & Coverity配置
R-2-2-1构造函数禁止使用全局变量强制自定义检查器构造内读写全局变量告警
R-2-2-2类必须显式定义默认构造函数强制自定义检查器无默认构造告警
R-2-2-3单参数构造必须加explicit强制原生复用隐式转换构造拦截
R-2-2-4构造函数初始化全部成员强制原生复用成员未初始化检查
R-2-2-5派生类构造必须调用直接基类构造强制原生复用继承构造完整性检查

4.2.3 6.3 析构函数(R-2-3 系列)

准则编号规则内容级别适配类型实现要点 & Coverity配置
R-2-3-1含虚函数的类,析构必须virtual强制原生复用C++经典安全规则
R-2-3-2析构函数异常必须内部捕获强制自定义检查器析构抛出未捕获异常告警

4.2.4 6.4 虚拟函数(R-2-4 系列)

准则编号规则内容级别适配类型实现要点 & Coverity配置
R-2-4-1重写虚函数不修改默认参数强制自定义检查器缺省参数一致性校验
R-2-4-2重写虚函数必须显式virtual强制自定义检查器缺失virtual告警
R-2-4-3非纯虚函数不能被重写为纯虚强制自定义检查器虚函数降级拦截

4.2.5 6.5 类型转换(R-2-5 / A-2-5 系列)

准则编号规则内容级别适配类型实现要点 & Coverity配置
R-2-5-1无关类型指针禁止强转为对象指针强制原生复用危险指针转换检查
R-2-5-2转换禁止去除const/volatile强制原生复用常量属性移除拦截
A-2-5-1推荐使用C++风格转换建议配置开关C风格强转告警

4.2.6 6.6 内存释放(R-2-6 系列)

准则编号规则内容级别适配类型实现要点 & Coverity配置
R-2-6-1new 必须配对 delete强制原生复用内存配对检查
R-2-6-2new[] 必须配对 delete[]强制原生复用数组内存释放匹配
R-2-6-3delete 必须使用原始指针强制自定义检查器指针偏移后delete告警

4.2.7 6.7 函数定义与使用(R-2-7 / A-2-7 系列)

准则编号规则内容级别适配类型实现要点 & Coverity配置
R-2-7-1定长数组传参使用引用强制自定义检查器数组退化指针拦截
R-2-7-2const成员函数不返回非const指针/引用强制原生复用const权限检查
R-2-7-3禁止外部修改私有成员强制自定义检查器成员外泄告警
A-2-7-1类内不写函数实现建议配置开关类内函数实现告警
A-2-7-2非修改指针/引用参数加const建议配置开关可const参数未修饰告警

4.2.8 6.8 异常处理(R-2-8 / A-2-8 系列)

准则编号规则内容级别适配类型实现要点 & Coverity配置
R-2-8-1异常捕获:派生类在前、基类在后强制自定义检查器catch顺序校验
R-2-8-2每一种throw都要有对应catch强制原生复用未捕获异常检查
R-2-8-3异常必须引用方式捕获强制自定义检查器值/指针捕获拦截
R-2-8-4默认捕获catch(...)放在最后强制自定义检查器默认捕获顺序校验
R-2-8-5禁止直接throw NULL强制自定义检查器throw NULL拦截
A-2-8-1建议增加默认捕获兜底建议配置开关无默认捕获告警
A-2-8-2谨慎抛出/捕获指针异常建议配置开关指针异常告警

4.2.9 6.9 其他条款(R-2-9 / A-2-9 系列)

准则编号规则内容级别适配类型实现要点 & Coverity配置
R-2-9-1模板声明、定义、实现同文件强制自定义检查器模板代码分离告警
A-2-9-1模板参数使用typename建议配置开关模板关键字校验
A-2-9-2const 修饰放类型最左侧建议配置开关const书写风格告警
A-2-9-3不重载&&、||、逗号运算符建议配置开关运算符重载告警
A-2-9-4禁用旧式.h标准头文件建议配置开关iostream.h等旧式头文件告警

五、补充说明

  1. 落地优先级:优先「原生复用+配置开关」规则,再分批开发自定义规则;
  2. 合规校验:所有规则必须使用标准内「违背/遵循示例」完成漏报、误报测试;
  3. 报表适配:将GJB8114规则编号作为Coverity自定义字段,直接用于违背率计算与审计;
  4. 告警统一规范:强制准则=Error(门禁阻断),建议准则=Warning(仅记录)。