Appendix A Summary of guidelines

Rule 1.1 Required 
该程序不应包含任何违反标准C语法和约束，并且不应超过实现的翻译限制, utf8 test: ∑
Rule 1.2 Advisory 
不应该使用语言扩展
Rule 1.3 Required 
不应发生未定义或关键未指定的行为

Rule 2.1 Required 
项目不应包含不可访问的代码
Rule 2.2 Required 
应没有死代码
Rule 2.3 Advisory 
项目不应该包含未使用的类型声明
Rule 2.4 Advisory 
项目不应该包含未使用的标记声明
Rule 2.5 Advisory 
项目不应该包含未使用的宏声明
Rule 2.6 Advisory 
函数不应该包含未使用的标签声明
Rule 2.7 Advisory 
函数中不应该有未使用的参数

Rule 3.1 Required 
字符序列/*和//不能用于注释中
Rule 3.2 Required 
行拼接不能用于//注释中

Rule 4.1 Required 
八进制和十六进制转义序列应终止
Rule 4.2 Advisory 
不应该使用三字母组合

Rule 5.1 Required 
外部标识应当是明确的
Rule 5.2 Required 
在同一作用域和名称空间中声明的标识符应该是不同的
Rule 5.3 Required 
在内部作用域中声明的标识符不得隐藏在外部作用域中声明的标识符
Rule 5.4 Required 
宏标识符应该是不同的
Rule 5.5 Required 
标识符应该与宏名称不同
Rule 5.6 Required 
typedef名称应该是唯一的标识符
Rule 5.7 Required 
标签名称应该是唯一的标识符
Rule 5.8 Required 
定义具有外部链接的对象或函数的标识符应当是唯一的
Rule 5.9 Advisory 
定义具有内部链接的对象或函数的标识符应该是唯一的

Rule 6.1 Required 
位域只能用适当的类型声明
Rule 6.2 Required 
单位命名位字段不能是signed类型

Rule 7.1 Required 
八进制常数不能使用
Rule 7.2 Required 
'u'或'u'后缀应应用于以无符号类型表示的所有整数常量
Rule 7.3 Required 
小写字母“l”不能用于文字后缀
Rule 7.4 Required 
除非对象的类型为“指向const限定字符的指针”，否则字符串字面值不能赋值给对象。

Rule 8.1 Required 
类型应明确规定
Rule 8.2 Required 
功能类型应采用原型形式，参数应命名
Rule 8.3 Required 
对象或函数的所有声明都应使用相同的名称和类型限定符
Rule 8.4 Required 
当定义了具有外部链接的对象或函数时，兼容声明应该是可见的
Rule 8.5 Required 
外部对象或函数应该在一个且只能在一个文件中声明一次
Rule 8.6 Required 
具有外部链接的标识符应当只有一个外部定义
Rule 8.7 Advisory 
如果函数和对象仅在一个翻译单元中被引用，那么它们不应该用外部链接来定义
Rule 8.8 Required 
在具有内部链接的所有对象和函数声明中的静态存储类说明符应使用
Rule 8.9 Advisory 
如果一个对象的标识符只出现在一个函数中，那么它应该在块作用域中定义
Rule 8.10 Required 
内联函数应该用静态存储类声明
Rule 8.11 Advisory 
当声明具有外部链接的数组时，应显式指定其大小
Rule 8.12 Required 
在枚举数列表中，隐式指定的枚举常量的值应该是唯一的
Rule 8.13 Advisory 
只要可能，指针应该指向const限定类型
Rule 8.14 Required 
限制型限定符不得使用

Rule 9.1 Mandatory 
具有自动存储时长的对象的值在未设置前不能读取
Rule 9.2 Required 
聚合或联合的初始化式应该用大括号括起来
Rule 9.3 Required 
数组不能部分初始化
Rule 9.4 Required 
一个对象的元素不能被初始化超过一次
Rule 9.5 Required 
指定的初始化器是用来初始化数组对象的数组的大小应明确指定

Rule 10.1 Required 
操作数不能是不适当的基本类型
Rule 10.2 Required 
在进行加减法运算时，不得不当使用本质上是字符型的表达式
Rule 10.3 Required 
表达式的值不应分配给具有较窄的基本类型或不同的基本类型类别的对象
Rule 10.4 Required 
通常进行算术转换的运算符的两个操作数应具有相同的基本类型类别
Rule 10.5 Advisory 
不应将表达式的值转换为不适当的基本类型
Rule 10.6 Required 
复合表达式的值不能赋给具有更广泛基本类型的对象
Rule 10.7 Required 
如果一个复合表达式用作执行通常算术转换的操作符的一个操作数，则另一个操作数不应具有更广泛的基本类型
Rule 10.8 Required 
复合表达式的值不能被转换为不同的基本类型类别或更广泛的基本类型

Rule 11.1 Required 
函数指针与任何其他类型的指针之间不得进行转换
Rule 11.2 Required 
指向未完成类型的指针与任何其他类型之间不得进行转换
Rule 11.3 Required 
不应在指向对象类型的指针和指向不同对象类型的指针之间执行强制转换
Rule 11.4 Advisory 
不应在对象指针和整数类型之间执行转换
Rule 11.5 Advisory 
不应该将指向void的指针转换为指向对象的指针
Rule 11.6 Required 
转换不能在指向void的指针和算术类型之间进行
Rule 11.7 Required 
对象指针和非整数算术类型之间不应执行强制转换
Rule 11.8 Required 
类型转换不能从指针所指向的类型中移除任何const或volatile限定
Rule 11.9 Required 
宏NULL应该是唯一允许的整数空指针常量形式

Rule 12.1 Advisory 
表达式中操作符的优先级应该显式设置
Rule 12.2 Required 
移位操作符的右操作数应位于比左操作数基本类型的位宽小0到1的范围内
Rule 12.3 Advisory 
不应该使用逗号操作符
Rule 12.4 Advisory 
常量表达式的求值不应导致无符号整数环绕

Rule 13.1 Required 
初始化列表不应包含持久的副作用
Rule 13.2 Required 
在所有允许的计算顺序下，表达式的值及其持续的副作用应是相同的
Rule 13.3 Advisory 
一个完整的表达包含自增(++)或自减(——)操作符应该不会产生除自增或自减操作符引起的其他潜在副作用
Rule 13.4 Advisory 
不应该使用赋值操作符的结果
Rule 13.5 Required 
逻辑&&或||操作符的右操作数不应包含持久的副作用
Rule 13.6 Mandatory 
sizeof操作符的操作数不能包含任何有潜在副作用的表达式

Rule 14.1 Required 
循环计数器本质上不应该是浮动类型的
Rule 14.2 Required 
for回路应结构良好
Rule 14.3 Required 
控制表达式不应是不变的
Rule 14.4 Required 
一个if语句的控制表达式和一个迭代语句的控制表达式本质上应该是布尔类型

Rule 15.1 Advisory 
不应该使用goto语句
Rule 15.2 Required 
goto语句将跳转到同一函数中稍后声明的标签
Rule 15.3 Required 
goto语句引用的任何标签必须声明在同一块中，或者声明在包含goto语句的任何块中
Rule 15.4 Advisory 
用于终止任何迭代语句的break或goto语句不应该超过一个
Rule 15.5 Advisory 
函数在末尾应该有一个单独的退出点
Rule 15.6 Required 
迭代语句或选择语句的主体应为复合语句
Rule 15.7 Required 
如果……Else if结构应该以Else语句结束

Rule 16.1 Required 
所有开关语句应格式良好
Rule 16.2 Required 
switch标签只能在封装最紧密的复合语句是switch语句体时使用
Rule 16.3 Required 
一个无条件的中断语句应该终止每个开关子句
Rule 16.4 Required 
每个switch语句都应有一个默认标签
Rule 16.5 Required 
默认标签应该作为switch语句的第一个或最后一个switch标签出现
Rule 16.6 Required 
每个switch语句至少有两个switch子句
Rule 16.7 Required 
开关表达式本质上不应该有布尔类型

Rule 17.1 Required 
不能使用<stdarg.h>特性
Rule 17.2 Required 
函数不能直接或间接地调用自己
Rule 17.3 Mandatory 
函数不能隐式声明
Rule 17.4 Mandatory 
返回类型为非void的函数的所有退出路径都应该有一个带表达式的显式返回语句
Rule 17.5 Advisory 
声明为数组类型的形参对应的函数实参应具有适当数量的元素
Rule 17.6 Mandatory 
数组参数的声明不能包含[]之间的static关键字。
Rule 17.7 Required 
返回类型为非空应使用的函数返回的值
Rule 17.8 Advisory 
函数参数不应被修改

Rule 18.1 Required 
由指针操作数的算术运算产生的指针应指向与该指针操作数相同的数组元素
Rule 18.2 Required 
指针之间的减法只适用于指向同一数组元素的指针
Rule 18.3 Required 
关系操作符>、>=、<和<=不能应用于指针类型的对象，除非它们指向同一个对象
Rule 18.4 Advisory 
+、-、+=和-=操作符不应应用于指针类型的表达式
Rule 18.5 Advisory 
声明应该包含不超过两层的指针嵌套
Rule 18.6 Required 
具有自动存储功能的对象的地址不能复制到第一个对象消失后仍然存在的另一个对象
Rule 18.7 Required 
灵活数组成员不能被声明
Rule 18.8 Required 
不应使用变长数组类型

Rule 19.1 Mandatory 
一个对象不能被分配或复制到一个重叠的对象
Rule 19.2 Advisory 
建议不允许使用关键字union

Rule 20.1 Advisory 
#include指令应该只在预处理指令或注释之前
Rule 20.2 Required 
'， '或\字符和/*或//字符序列不能出现在头文件名中
Rule 20.3 Required 
#include指令后面应该有一个<filename>或"filename"序列
Rule 20.4 Required 
宏的定义不能与关键字同名
Rule 20.5 Advisory 
#undef不应该被使用
Rule 20.6 Required 
看起来像预处理指令的令牌不应该出现在宏参数中
Rule 20.7 Required 
由宏参数展开产生的表达式应括在括号内
Rule 20.8 Required 
预处理指令#if或#elif的控制表达式的值应为0或1
Rule 20.9 Required 
if或elif预处理指令的控制表达式中使用的所有标识符都应该在求值之前定义
Rule 20.10 Advisory 
不应该使用#和##预处理操作符
Rule 20.11 Required 
紧跟在#运算符之后的宏参数不能紧跟在##运算符之后
Rule 20.12 Required 
作为#或##操作符的操作数使用的宏参数(其本身需要进行宏替换)只能作为这些操作符的操作数使用
Rule 20.13 Required 
第一个标记为#的行应该是一个有效的预处理指令
Rule 20.14 Required 
所有#else、#elif和#endif预处理器指令都应该与相关的#if、#ifdef或#ifndef指令位于同一个文件中

Rule 21.1 Required 
#define和#undef不能用于保留标识符或保留宏名
Rule 21.2 Required 
保留的标识符或宏名不能被声明
Rule 21.3 Required 
不能使用<stdlib.h>的内存分配和回收函数
Rule 21.4 Required 
不能使用标准头文件<setjmp.h>
Rule 21.5 Required 
不能使用标准头文件<signal.h>
Rule 21.6 Required 
不能使用标准库的输入/输出函数
Rule 21.7 Required 
<stdlib.h>的atof、atoi、atol和atoll函数不得使用
Rule 21.8 Required 
不能使用库函数abort、exit、getenv和<stdlib.h>的system
Rule 21.9 Required 
<stdlib.h>的库函数bsearch和qsort不能使用
Rule 21.10 Required 
不能使用标准图书馆的时间和日期函数
Rule 21.11 Required 
不能使用标准头文件<tgmath.h>
Rule 21.12 Advisory 
不应该使用<fenv.h>的异常处理特性

Rule 22.1 Required 
所有通过标准库函数动态获得的资源都应显式发布
Rule 22.2 Mandatory 
只有通过标准库函数分配的内存块才会被释放
Rule 22.3 Required 
不能在不同的流上同时打开同一个文件进行读写访问
Rule 22.4 Mandatory 
不能试图写入已以只读方式打开的流
Rule 22.5 Mandatory 
指向FILE对象的指针不能被解除引用
Rule 22.6 Mandatory 
指向FILE的指针的值在相关流关闭后不能再使用