指针赋予了C编程最大的灵活性;结构体使得C程序整齐而紧凑;联合体在某些要求注重效率的场合有精彩的表现,这三个要素是C语言的精华。


    然而,精华并不意味着完美,
C语言在赋予程序员足够灵活性的同时,也给了程序员很多犯错误的机会。所以有必要关注指针、结构体和联合体的实现细节,从而保障程序的安全性。


    在此.第一部分介绍《
MISRAC2004》中与指针相关的部分规则,第二部分讲解结构体和联合体的操作规范。下文中凡是未加特殊说明的都是强制(required)规则,个别推荐(advisory)规则加了“推荐”标示。


指针的安全规范

 

    《MISRAC2004》关于指针的规范主要分为三个部分:指针的类型转换规则、指针运算的规则和指针的有效性规则。


1.1

 

  指针的类型转换

    指针类型转换是个高风险的操作,所以应该尽量避免进行这个操作。MISRAC对其中可能造成严重错误的情况作了严格的限定,选择其中两条作简要分析。


    规则
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单元( 1 2 3 4 5 6 7 下一页

评论】【加入收藏夹】【打印】【关闭

  评论人 评论内容 发表时间
发表评论
用户名:   匿名发表