C/C++ 共用准则
浏览 C/C++ 共用编程语言特性和模式的规则
禁止宏定义覆盖关键字
4 scenarios
禁止宏定义到关键字
2 scenarios
禁止遮蔽 typedef 类型
1 scenario
禁止遮蔽标准库标识符
C/C++ 标准库标识符包含类型与变量标识符,禁止用户重新定义这些标识符。
1 scenario
禁止重复定义宏
例外: ...
5 scenarios
禁止函数内的 #define 和 #undef 不配对
函数内的 #define 在函数退出前必须有对应 #undef
6 scenarios
禁止宏函数的参数和结果未加括号
4 scenarios
禁止匿名结构、联合、枚举
3 scenarios
禁止结构体定义中含有匿名结构体
2 scenarios
禁止有符号位域的位宽等于 1
3 scenarios
禁止位域未明确符号性
3 scenarios
禁止位域基类型大小不一致或跨越基类型边界
2 scenarios
禁止函数声明省略参数类型或名称
例外: C++ 允许重载,空参数列表的函数声明是可能指向另一个函数
5 scenarios
禁止函数声明与定义不一致
包括: 函数返回值类型、参数类型、参数名。 ...
8 scenarios
禁止函数参数省略类型
隐式声明的参数类型在 C 语言中是允许的,默认为“int”;但ISO C99 及更高版本以及 C ...
2 scenarios
禁止外部声明变量的类型与定义不一致
2 scenarios
禁止函数体内 extern 声明
1 scenario
禁止数组定义没有显式边界
2 scenarios
禁止 extern 声明初始化变量
2 scenarios
禁止用于数值计算的字符型变量未定义符号性
3 scenarios
禁止 #include 绝对路径
5 scenarios
禁止重复包含头文件
3 scenarios
禁止函数参数表为空时显式声明 void
3 scenarios
禁止循环体省略大括号
6 scenarios
禁止 if、else if、else 省略大括号
2 scenarios
禁止头文件包含出现在可执行代码之后
4 scenarios
禁止二义性逻辑表达式
二义性逻辑表达式是指在没有使用括号明确优先级的情况下,使用逻辑运算符连接的表达式。 ...
3 scenarios
禁止比较表达式中的运算项未使用括号
在比较表达式中,运算项未使用括号可能导致二义性和错误的逻辑判断。 ...
4 scenarios
禁止嵌套注释
8 scenarios
禁止多级指针
多级指针是三级与三级以上的指针。多级指针的使用会增加代码的复杂性和可读性问题,因此不推荐使用。
4 scenarios
禁止函数隐式转换为指针
2 scenarios
禁止对指针型参数重新赋值
2 scenarios
禁止返回局部变量地址
2 scenarios
禁止使用或释放未分配或已释放的指针
注意:与 #R-1-6-16 《禁止使用已释放的内存》有某种程度上重复 ...
1 scenario
禁止释放指针变量后未置空
5 scenarios
禁止动态分配的指针变量未初始化
4 scenarios
禁止动态分配的指针变量未检查即使用
11 scenarios
禁止使用整型数 0 表示空指针
8 scenarios
禁止文件指针未关闭
4 scenarios
禁止省略 if-else if 语句的 else 分支
2 scenarios
禁止条件分支为空
例外: 使用空语句 `;` 并随后加以 `/* no deal with */` 注释说明。
5 scenarios
禁止空 switch 语句
1 scenario
禁止对逻辑表达式使用 switch 语句
5 scenarios
禁止 switch 语句仅包含 default
2 scenarios
禁止 switch 省略 default
例外: 枚举类型并且完全列举
4 scenarios
禁止 switch 中 case 和 default 未以 break 或 return 终止
例外: 共用 case 必须随后加以 `/* shared */` 注释说明
8 scenarios
禁止 switch 语句的分支层次不一致
6 scenarios
禁止向内或向后 goto
向内 goto: 指的是在复合语句外跳转到复合语句内的标签 ...
4 scenarios
禁止 setjmp/longjmp
1 scenario
禁止将浮点字面量赋值给整型变量
3 scenarios
禁止整数赋值越界
2 scenarios
禁止将赋值语句作为逻辑表达式
4 scenarios
禁止对逻辑表达式进行位运算
3 scenarios
禁止在运算表达式或函数调用参数中使用自增自减
2 scenarios
禁止移位运算超出变量长度
2 scenarios
禁止移位数为负数
1 scenario
禁止数组越界使用
4 scenarios
禁止数组下标为负数
3 scenarios
禁止对字面量值取逻辑非
2 scenarios
禁止非枚举类型变量赋值枚举值
2 scenarios
禁止零除
3 scenarios
禁止 sizeof 中使用赋值
2 scenarios
禁止缓存区读取越界
5 scenarios
禁止缓存区写入越界
2 scenarios
禁止使用已释放的内存
重合: #R-1-3-5 《禁止使用或释放未分配或已释放的指针》有某种程度上重复,做了详细界定
7 scenarios
禁止释放非最初分配地址的指针
4 scenarios
禁止使用 gets 函数
推荐使用 fgets 或者其他安全函数替代 gets 函数
3 scenarios
禁止字符串函数操作导致目标存储空间越界
2 scenarios
禁止覆盖标准库函数
1 scenario
禁止实参和形参类型不一致
例外: C++ 函数重载
2 scenarios
禁止实参与形参的个数不一致
例外: C++ 函数重载
2 scenarios
禁止 K&R 风格函数定义
K&R 风格函数定义是指函数的参数在函数体外声明,函数体内不再声明参数类型。K&R 风格函数定义 ...
2 scenarios
禁止函数声明和定义的参数类型不一致
重合: #R-1-1-14
2 scenarios
禁止函数声明和定义的返回值类型不一致
重合: #R-1-1-14
2 scenarios
禁止非 void 函数省略 return 语句
2 scenarios
禁止 void 函数 return 语句带值
2 scenarios
禁止非 void 函数的 return 语句不带值
3 scenarios
禁止函数返回值类型与定义不一致
2 scenarios
禁止忽略函数调用返回值而未加 (void)
非 void 函数的返回值可能会影响程序的执行结果,忽略时应显式地加上 (void) 说明
2 scenarios
禁止使用 (void) 转换 void 函数调用的返回值
2 scenarios
禁止未使用的静态函数
1 scenario
禁止同一表达式中调用多个相关函数
相关函数是指在同一表达式中调用的函数,且它们之间存在数据依赖关系,将导致未定义行为。
2 scenarios
禁止函数参数列表中使用省略号
省略号的使用会导致函数参数类型不明确,可能会引起不必要的错误
2 scenarios
禁止递归
嵌入式系统中,递归函数可能会导致栈溢出
3 scenarios
禁止不可达语句
3 scenarios
禁止不可达分支
9 scenarios
禁止无效语句
5 scenarios
禁止使用八进制数
例外: 八进制数加以 `/* octal */` 注释说明
2 scenarios
禁止小写字母数字后缀
2 scenarios
禁止 for 循环控制变量使用非局部变量
2 scenarios
禁止 for 循环控制变量为非整数型
3 scenarios
禁止 for 循环内修改控制变量
for 循环控制变量在循环体内被修改,可能导致循环条件判断错误,造成死循环或意外行为。
1 scenario
禁止 while(1) 以外的无限循环
2 scenarios
禁止浮点数变量赋给整型变量
例外: 浮点数经过强制转换
2 scenarios
禁止长整数变量赋给短整数变量
例外: 长整型经过强制转换
3 scenarios
禁止 double 型变量赋给 float 型变量
例外: double 型经过强制转换
2 scenarios
禁止指针变量的赋值类型与指针变量类型不一致
3 scenarios
禁止指针与非指针变量之间赋值
例外: 指针与非指针变量之间的经过强制转换
3 scenarios
禁止无实质作用的类型转换
5 scenarios
禁止使用未初始化变量
6 scenarios
禁止变量缺省初始化
3 scenarios
禁止结构体初始化列表的嵌套结构与定义不一致
3 scenarios
禁止枚举元素定义不完整
2 scenarios
禁止对 boolean 值进行无意义比较
3 scenarios
禁止对指针进行无意义比较
3 scenarios
禁止浮点数相等比较
应该判断精度误差范围。
2 scenarios
禁止对无符号数进行无意义比较
1 scenario
禁止无符号数与有符号数比较
3 scenarios
禁止局部变量与全局变量同名
4 scenarios
禁止形参与全局变量同名
1 scenario
禁止变量与函数同名
1 scenario
禁止变量与标识符同名
2 scenarios
禁止变量与枚举元素同名
1 scenario
禁止变量与 typedef 类型同名
1 scenario
禁止变量遮蔽
变量遮蔽是指在一个作用域中定义了一个与外部作用域中同名的变量,导致外部变量被遮蔽。
4 scenarios
禁止仅大小写区分的变量
4 scenarios
禁止仅小写字母 “l” 与数字 “1” 区分的变量
1 scenario
禁止仅小写字母 “l” 与数字 “1” 区分的变量
1 scenario
禁止单独使用小写字母 “l” 或大写字母 “O” 作为变量名
2 scenarios
禁止程序外部可改写的变量未使用 volatile 修饰
例如:与其他线程共享的变量
1 scenario
禁止表达式多次引用同一 volatile 变量
2 scenarios
禁止将 NULL 用作整型数
3 scenarios
禁止无符号变量赋负值
2 scenarios
禁止字符串数组未以 '\0' 结束
7 scenarios
建议宏内括号匹配
2 scenarios