C/C++ 共用准则

浏览 C/C++ 共用编程语言特性和模式的规则

R-1-1-1声明定义
强制

禁止宏定义覆盖关键字

4 scenarios

R-1-1-2声明定义
强制

禁止宏定义到关键字

2 scenarios

R-1-1-3声明定义
强制

禁止遮蔽 typedef 类型

1 scenario

R-1-1-4声明定义
强制

禁止遮蔽标准库标识符

C/C++ 标准库标识符包含类型与变量标识符,禁止用户重新定义这些标识符。

1 scenario

R-1-1-5声明定义
强制

禁止重复定义宏

例外: ...

5 scenarios

R-1-1-6声明定义
强制

禁止函数内的 #define 和 #undef 不配对

函数内的 #define 在函数退出前必须有对应 #undef

6 scenarios

R-1-1-7声明定义
强制

禁止宏函数的参数和结果未加括号

4 scenarios

R-1-1-8声明定义
强制

禁止匿名结构、联合、枚举

3 scenarios

R-1-1-9声明定义
强制

禁止结构体定义中含有匿名结构体

2 scenarios

R-1-1-10声明定义
强制

禁止有符号位域的位宽等于 1

3 scenarios

R-1-1-11声明定义
强制

禁止位域未明确符号性

3 scenarios

R-1-1-12声明定义
强制

禁止位域基类型大小不一致或跨越基类型边界

2 scenarios

R-1-1-13声明定义
强制

禁止函数声明省略参数类型或名称

例外: C++ 允许重载,空参数列表的函数声明是可能指向另一个函数

5 scenarios

R-1-1-14声明定义
强制

禁止函数声明与定义不一致

包括: 函数返回值类型、参数类型、参数名。 ...

8 scenarios

R-1-1-15声明定义
强制

禁止函数参数省略类型

隐式声明的参数类型在 C 语言中是允许的,默认为“int”;但ISO C99 及更高版本以及 C ...

2 scenarios

R-1-1-16声明定义
强制

禁止外部声明变量的类型与定义不一致

2 scenarios

R-1-1-17声明定义
强制

禁止函数体内 extern 声明

1 scenario

R-1-1-18声明定义
强制

禁止数组定义没有显式边界

2 scenarios

R-1-1-19声明定义
强制

禁止 extern 声明初始化变量

2 scenarios

R-1-1-20声明定义
强制

禁止用于数值计算的字符型变量未定义符号性

3 scenarios

R-1-1-21声明定义
强制

禁止 #include 绝对路径

5 scenarios

R-1-1-22声明定义
强制

禁止重复包含头文件

3 scenarios

R-1-1-23声明定义
强制

禁止函数参数表为空时显式声明 void

3 scenarios

R-1-2-1版面书写
强制

禁止循环体省略大括号

6 scenarios

R-1-2-2版面书写
强制

禁止 if、else if、else 省略大括号

2 scenarios

R-1-2-3版面书写
强制

禁止头文件包含出现在可执行代码之后

4 scenarios

R-1-2-4版面书写
强制

禁止二义性逻辑表达式

二义性逻辑表达式是指在没有使用括号明确优先级的情况下,使用逻辑运算符连接的表达式。 ...

3 scenarios

R-1-2-5版面书写
强制

禁止比较表达式中的运算项未使用括号

在比较表达式中,运算项未使用括号可能导致二义性和错误的逻辑判断。 ...

4 scenarios

R-1-2-6版面书写
强制

禁止嵌套注释

8 scenarios

R-1-3-1指针使用
强制

禁止多级指针

多级指针是三级与三级以上的指针。多级指针的使用会增加代码的复杂性和可读性问题,因此不推荐使用。

4 scenarios

R-1-3-2指针使用
强制

禁止函数隐式转换为指针

2 scenarios

R-1-3-3指针使用
强制

禁止对指针型参数重新赋值

2 scenarios

R-1-3-4指针使用
强制

禁止返回局部变量地址

2 scenarios

R-1-3-5指针使用
强制

禁止使用或释放未分配或已释放的指针

注意:与 #R-1-6-16 《禁止使用已释放的内存》有某种程度上重复 ...

1 scenario

R-1-3-6指针使用
强制

禁止释放指针变量后未置空

5 scenarios

R-1-3-7指针使用
强制

禁止动态分配的指针变量未初始化

4 scenarios

R-1-3-8指针使用
强制

禁止动态分配的指针变量未检查即使用

11 scenarios

R-1-3-9指针使用
强制

禁止使用整型数 0 表示空指针

8 scenarios

R-1-3-10指针使用
强制

禁止文件指针未关闭

4 scenarios

R-1-4-1分支控制
强制

禁止省略 if-else if 语句的 else 分支

2 scenarios

R-1-4-2分支控制
强制

禁止条件分支为空

例外: 使用空语句 `;` 并随后加以 `/* no deal with */` 注释说明。

5 scenarios

R-1-4-3分支控制
强制

禁止空 switch 语句

1 scenario

R-1-4-4分支控制
强制

禁止对逻辑表达式使用 switch 语句

5 scenarios

R-1-4-5分支控制
强制

禁止 switch 语句仅包含 default

2 scenarios

R-1-4-6分支控制
强制

禁止 switch 省略 default

例外: 枚举类型并且完全列举

4 scenarios

R-1-4-7分支控制
强制

禁止 switch 中 case 和 default 未以 break 或 return 终止

例外: 共用 case 必须随后加以 `/* shared */` 注释说明

8 scenarios

R-1-4-8分支控制
强制

禁止 switch 语句的分支层次不一致

6 scenarios

R-1-5-1跳转控制
强制

禁止向内或向后 goto

向内 goto: 指的是在复合语句外跳转到复合语句内的标签 ...

4 scenarios

R-1-5-2跳转控制
强制

禁止 setjmp/longjmp

1 scenario

R-1-6-1运算处理
强制

禁止将浮点字面量赋值给整型变量

3 scenarios

R-1-6-2运算处理
强制

禁止整数赋值越界

2 scenarios

R-1-6-3运算处理
强制

禁止将赋值语句作为逻辑表达式

4 scenarios

R-1-6-4运算处理
强制

禁止对逻辑表达式进行位运算

3 scenarios

R-1-6-5运算处理
强制

禁止在运算表达式或函数调用参数中使用自增自减

2 scenarios

R-1-6-6运算处理
强制

禁止移位运算超出变量长度

2 scenarios

R-1-6-7运算处理
强制

禁止移位数为负数

1 scenario

R-1-6-8运算处理
强制

禁止数组越界使用

4 scenarios

R-1-6-9运算处理
强制

禁止数组下标为负数

3 scenarios

R-1-6-10运算处理
强制

禁止对字面量值取逻辑非

2 scenarios

R-1-6-11运算处理
强制

禁止非枚举类型变量赋值枚举值

2 scenarios

R-1-6-12运算处理
强制

禁止零除

3 scenarios

R-1-6-13运算处理
强制

禁止 sizeof 中使用赋值

2 scenarios

R-1-6-14运算处理
强制

禁止缓存区读取越界

5 scenarios

R-1-6-15运算处理
强制

禁止缓存区写入越界

2 scenarios

R-1-6-16运算处理
强制

禁止使用已释放的内存

重合: #R-1-3-5 《禁止使用或释放未分配或已释放的指针》有某种程度上重复,做了详细界定

7 scenarios

R-1-6-17运算处理
强制

禁止释放非最初分配地址的指针

4 scenarios

R-1-6-18运算处理
强制

禁止使用 gets 函数

推荐使用 fgets 或者其他安全函数替代 gets 函数

3 scenarios

R-1-6-19运算处理
强制

禁止字符串函数操作导致目标存储空间越界

2 scenarios

R-1-7-1函数调用
强制

禁止覆盖标准库函数

1 scenario

R-1-7-2函数调用
强制

禁止实参和形参类型不一致

例外: C++ 函数重载

2 scenarios

R-1-7-3函数调用
强制

禁止实参与形参的个数不一致

例外: C++ 函数重载

2 scenarios

R-1-7-4函数调用
强制

禁止 K&R 风格函数定义

K&R 风格函数定义是指函数的参数在函数体外声明,函数体内不再声明参数类型。K&R 风格函数定义 ...

2 scenarios

R-1-7-5函数调用
强制

禁止函数声明和定义的参数类型不一致

重合: #R-1-1-14

2 scenarios

R-1-7-6函数调用
强制

禁止函数声明和定义的返回值类型不一致

重合: #R-1-1-14

2 scenarios

R-1-7-7函数调用
强制

禁止非 void 函数省略 return 语句

2 scenarios

R-1-7-8函数调用
强制

禁止 void 函数 return 语句带值

2 scenarios

R-1-7-9函数调用
强制

禁止非 void 函数的 return 语句不带值

3 scenarios

R-1-7-10函数调用
强制

禁止函数返回值类型与定义不一致

2 scenarios

R-1-7-11函数调用
强制

禁止忽略函数调用返回值而未加 (void)

非 void 函数的返回值可能会影响程序的执行结果,忽略时应显式地加上 (void) 说明

2 scenarios

R-1-7-12函数调用
强制

禁止使用 (void) 转换 void 函数调用的返回值

2 scenarios

R-1-7-13函数调用
强制

禁止未使用的静态函数

1 scenario

R-1-7-14函数调用
强制

禁止同一表达式中调用多个相关函数

相关函数是指在同一表达式中调用的函数,且它们之间存在数据依赖关系,将导致未定义行为。

2 scenarios

R-1-7-15函数调用
强制

禁止函数参数列表中使用省略号

省略号的使用会导致函数参数类型不明确,可能会引起不必要的错误

2 scenarios

R-1-7-16函数调用
强制

禁止递归

嵌入式系统中,递归函数可能会导致栈溢出

3 scenarios

R-1-8-1语句使用
强制

禁止不可达语句

3 scenarios

R-1-8-2语句使用
强制

禁止不可达分支

9 scenarios

R-1-8-3语句使用
强制

禁止无效语句

5 scenarios

R-1-8-4语句使用
强制

禁止使用八进制数

例外: 八进制数加以 `/* octal */` 注释说明

2 scenarios

R-1-8-5语句使用
强制

禁止小写字母数字后缀

2 scenarios

R-1-9-1循环控制
强制

禁止 for 循环控制变量使用非局部变量

2 scenarios

R-1-9-2循环控制
强制

禁止 for 循环控制变量为非整数型

3 scenarios

R-1-9-3循环控制
强制

禁止 for 循环内修改控制变量

for 循环控制变量在循环体内被修改,可能导致循环条件判断错误,造成死循环或意外行为。

1 scenario

R-1-9-4循环控制
强制

禁止 while(1) 以外的无限循环

2 scenarios

R-1-10-1类型转换
强制

禁止浮点数变量赋给整型变量

例外: 浮点数经过强制转换

2 scenarios

R-1-10-2类型转换
强制

禁止长整数变量赋给短整数变量

例外: 长整型经过强制转换

3 scenarios

R-1-10-3类型转换
强制

禁止 double 型变量赋给 float 型变量

例外: double 型经过强制转换

2 scenarios

R-1-10-4类型转换
强制

禁止指针变量的赋值类型与指针变量类型不一致

3 scenarios

R-1-10-5类型转换
强制

禁止指针与非指针变量之间赋值

例外: 指针与非指针变量之间的经过强制转换

3 scenarios

R-1-10-6类型转换
强制

禁止无实质作用的类型转换

5 scenarios

R-1-11-1初始化
强制

禁止使用未初始化变量

6 scenarios

R-1-11-2初始化
强制

禁止变量缺省初始化

3 scenarios

R-1-11-3初始化
强制

禁止结构体初始化列表的嵌套结构与定义不一致

3 scenarios

R-1-11-4初始化
强制

禁止枚举元素定义不完整

2 scenarios

R-1-12-1比较判断
强制

禁止对 boolean 值进行无意义比较

3 scenarios

R-1-12-2比较判断
强制

禁止对指针进行无意义比较

3 scenarios

R-1-12-3比较判断
强制

禁止浮点数相等比较

应该判断精度误差范围。

2 scenarios

R-1-12-4比较判断
强制

禁止对无符号数进行无意义比较

1 scenario

R-1-12-5比较判断
强制

禁止无符号数与有符号数比较

3 scenarios

R-1-13-1变量使用
强制

禁止局部变量与全局变量同名

4 scenarios

R-1-13-2变量使用
强制

禁止形参与全局变量同名

1 scenario

R-1-13-3变量使用
强制

禁止变量与函数同名

1 scenario

R-1-13-4变量使用
强制

禁止变量与标识符同名

2 scenarios

R-1-13-5变量使用
强制

禁止变量与枚举元素同名

1 scenario

R-1-13-6变量使用
强制

禁止变量与 typedef 类型同名

1 scenario

R-1-13-7变量使用
强制

禁止变量遮蔽

变量遮蔽是指在一个作用域中定义了一个与外部作用域中同名的变量,导致外部变量被遮蔽。

4 scenarios

R-1-13-8变量使用
强制

禁止仅大小写区分的变量

4 scenarios

R-1-13-9变量使用
强制

禁止仅小写字母 “l” 与数字 “1” 区分的变量

1 scenario

R-1-13-10变量使用
强制

禁止仅小写字母 “l” 与数字 “1” 区分的变量

1 scenario

R-1-13-11变量使用
强制

禁止单独使用小写字母 “l” 或大写字母 “O” 作为变量名

2 scenarios

R-1-13-12变量使用
强制

禁止程序外部可改写的变量未使用 volatile 修饰

例如:与其他线程共享的变量

1 scenario

R-1-13-13变量使用
强制

禁止表达式多次引用同一 volatile 变量

2 scenarios

R-1-13-14变量使用
强制

禁止将 NULL 用作整型数

3 scenarios

R-1-13-15变量使用
强制

禁止无符号变量赋负值

2 scenarios

R-1-13-16变量使用
强制

禁止字符串数组未以 '\0' 结束

7 scenarios

A-1-1-2声明定义
建议

建议宏内括号匹配

2 scenarios