101.不能对指针进行算术操作(A)
本条的目的是为了防止指针指向无效的内存空间。例如
void myfunc(void)
{
int *a;
int *b;
int arr[10];
a = arr;
a ++; /* 与规则冲突 */
a --; /* 与规则冲突 */
b = a+1; /* 与规则冲突 */
}
102.不能使用多余两层的间接寻址方式(A)例如:
struct my_struct {
int **p; /*与规则冲突 */
}
struct my_struct ** myfunc1(void) /*与规则冲突 */
{
...
}
struct my_struct * myfunc2(struct my_struct **avg) /*与规则冲突 */
{
...
}
103.关系运算不能用于指针类型,除非两个操作数是一样的类型并且指向相同的数组,结构体或联合体(R)这里的关系运算符不包含==和!=
void myfunc(void)
{
int *p1;
int *p2
int tab1[10];
int tab2[10];
p1 = tab1;
p2 = tab2;
if(p1 > p2) { /* 与规则冲突 */
...
}
}
104.非常数的函数指针不能使用(R)
非常数也就是指该值是在程序运行期间通过一些列计算得到的。如果该值是在程序编译时或者是一固定常数,则可以使用。
105.由一个函数指针指向的所有函数应该在参数的个数,类型和返回值上有区别(R)
这主要是便于区分函数。
106.动态存储的对象地址不能赋给那些即使对象已经是否但是其依然存在的对象(R)
int* globalvar;
int globalvar2;
void foo () {
int x=0;
globalvar=&x; // violation
globalvar2=x; // ok
}
107.空指针不能被废弃(R)
即在指针使用前应判断其值是否是NULL。
108.在结构体和联合体的规范中,结构体和联合体的所有成员应该都要详细说明或定义(R)
例如:
struct my_struct {
int a;
}
struct com_strcut {
struct my_struct s1;
struct your_struct s2; /* 与规则相冲突 */
int b;
}
109.重叠的变量存储不能使用(R)也就是不准使用Union
110.联合体不能被用来访问大数据类型的子部分(R)
如果遵循规则109,该条就不用考虑。实际上该规则是针对下面的情况。
union my_union{
char c;
short int s;
int a;
}
111.位域只能用unsigned int 或signed int定义(R)enum E_TAG { E1, E2};
112.采用signed int的位域类型至少2位长(R)
struct my_struct
{
unsigned char f1:2; /* 与规则111冲突 */
unsigned short f2:2; /* 与规则111冲突 */
unsigned long f3:2; /* 与规则111冲突 */
unsigned int f4:2; /* OK */
signed int f5:1; /* 与规则112冲突 */
enum E_TAG f8:2; /* 与规则111冲突 */
};
113.结构体和联合体的所有成员都应该命名并且只能通过它们的名字进行访问(R)