指针、结构体、联合体的安全规范
http://tech.ddvip.com 2008年07月11日 社区交流
本文详细介绍指针、结构体、联合体的安全规范
指针赋予了C编程最大的灵活性;结构体使得C程序整齐而紧凑;联合体在某些要求注重效率的场合有精彩的表现,这三个要素是C语言的精华。
然而,精华并不意味着完美,C语言在赋予程序员足够灵活性的同时,也给了程序员很多犯错误的机会。所以有必要关注指针、结构体和联合体的实现细节,从而保障程序的安全性。
在此.第一部分介绍《MISRA—C:2004》中与指针相关的部分规则,第二部分讲解结构体和联合体的操作规范。下文中凡是未加特殊说明的都是强制(required)规则,个别推荐(advisory)规则加了“推荐”标示。
1 指针的安全规范
《MISRA—C:2004》关于指针的规范主要分为三个部分:指针的类型转换规则、指针运算的规则和指针的有效性规则。
1.1 指针的类型转换
指针类型转换是个高风险的操作,所以应该尽量避免进行这个操作。MISRA—C对其中可能造成严重错误的情况作了严格的限定,选择其中两条作简要分析。
规则11.4(推荐):指向不同数据类型的指针之间不能相互转换。
思考如下程序:
uint8_t*pl;
uint32)_t*p2;
p2=(uint32_t*)pl;
/*注:uint8_t表示8位无符号整型,uint3_t表示32位无符号整型。*/
程序员希望将从p1单元开始的4个字节组成一个32付的整型来参与运算。
如果CPU允许各种数据对象存放在任意的存储单元,则以上转换没有问题。但某些CPU对某种(些)数据类型加强了对齐限制,要求这些数据对象占用一定的地址空间,比如某些字节寻址的CPU会要求32位(4字节)整型存放在4的整倍数地址上。在这个前提下.思考程序中的指针转换:假设pl一开始指向的是0x00O3单元(对uint8_t型的整型没有对齐要求),则执行最后一行强制转换后,p2到底指向哪个单元就无法预料了。
作者:张乐平 邵贝贝 责编:豆豆技术应用