第五章 安全问题与指针误用
由于C语言的涉及初衷,就是相信程序员,所以C语言被设计的很灵活。但这也就意味着C语言并不是一个安全的语言,很多问题都需要程序员自己来注意。在使用指针时更是如此,由于指针对内存操作的强大灵活性,稍有不慎便会导致内存的误操作,从而影响程序。对C语言的安全操作似乎成为了一个专门的研究方向。
- CERT 以上是一个很好的了解和获取C语言安全问题解决方案的来源。
本章从某种角度算是之前各章的一个安全问题总结,因此本章主要以TIP的形式给出使用C指针时需要注意的问题。
指针的声明和初始化
int *ptr1, ptr2
,这里ptr2
不是指针- 使用
类型定义
会比宏定义
要好,类型定义
可以允许编译器进行检验,宏定义
不一定会 - 代码
typedef int* PINT; PINT ptr1,ptr2
可以更好地声明指针。 - 指针声明后如果没有初始化,则是
野指针
。其指向的区域是未知的,这时候读写该指针都是危险的。所以声明指针后应当初始化。处理未初始化的指针有三种方式- 最简单的方式是赋值为
NULL
- 使用
<assert.h>
中的assert
函数 - 使用编译器
-Wall
选项
- 最简单的方式是赋值为
指针的使用
- 使用指针前检测是否为
NULL
- 注意迷途指针的产生
- 时刻注意内存区域的边界以及数据的大小
- 注意
sizeof
与strlen
的区别 - 不要使用结构体指针偏移的方式来访问结构体成员变量
内存的释放
- 不要重复释放内存