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