and
Mine
Automation
No.
5
Oct.
2007
文章编号
:1671
-
251X
(
2007
)
05
-
0125
-
02
C
语言程序设计的健壮性与安全性研究
姜青山
1
,
洪心兰
2
(
1.
南京信息工程大学计算机与软件学院
,
江苏
南京
210044
;
2.
兖矿集团职工大学机电工程系
,
山东
邹城
273500
)
摘要
:C
语言的灵活性
、
高效率及庞大的用户群
,
使得其具有广阔的应用市场
。设计高效
、
健壮
、
安全的
C
语言程序
,
一直是一种挑战
。
文章指出了在
C
语言程序设计中必须注意的问题
,
即类型转换不匹配
、
数组
越界
、
指针非法访问
、
内存泄漏等
。
关键词
:C
语言
;
程序设计
;
健壮性
;
安全性
中图分类号
:TP311.
1
文献标识码
:B
收稿日期
:2007
-
05
-
08
作者简介
:
姜青山
(
1964
-
)
,
男
,
副教授
,1987
年毕业于山东科
技大学计算机应用专业
,
现在南京信息工程大学计算机与软件学院
工作
,
研究方向为软件工程
、
并行分布计算。
0
引言
自
1973
年贝尔实验室设计出
C
语言以来
,C
语
言已经在市场上使用
30
多年了
,
无数的程序员设计
出了各种各样的程序
,
从嵌入式到操作系统
,
运行于
各种各样的设备中
。但已用
C
语言实现的程序
,
包
括操作系统
,
却存在许多漏洞和缺陷
,
经常导致系统
的瘫痪和崩溃
。只有充分了解
C
语言本身的特点
和陷阱
,
才能设计出高效
、
健壮
、
安全的程序
。
1
C
语言中的陷阱
1.
1
类型及转换
C
语言的基本类型长度不固定
,
依赖于程序所
运行
的
系
统
。确
定
类
型
大
小
的
通
用
原
则
:
sizeof
(
char
)
≤
sizeof
(
short
)
≤
sizeof
(
int
)
≤
sizeof
(
long
)
;
sizeof
(
float
)
≤
sizeof
(
double
)
≤
sizeof
(
long
double
)
;sizeof
(
char
)
≤
sizeof
(
wchar
)
[
2
]
。
任意
2
个
类型的值可以转换
,
但由大类型向小类型的转换可
能会发生转换错误
,
应该避免由大类型到小类型的
强制转换
。
另外要注意
float
和
double
类型是不精
确的
,
运算中有可能丢失精度
。
1.
2
void
类型
C
语言有
void
类型
,
但没有
void
类型的变量
。
viod
不是
0
,
不是空字符串
,
也不是
NULL
。
void
m
;
/
/
错误
,
没有
void
类型的变量
void
3
pv
;
/
/
pv
是指针
,
执行的类型不确定
void
f
(
)
;
/
/
函数
f
不返回值
1.
3
宏定义
尽量少用宏常量
(
如
#
define
m
10
)
,
而应该使
用
const
声明
(
如
const
int
m
=
10
)
。复杂的宏定义
展开时
,
可能并非像你想象的那样展开
,
容易引起难
以察觉的问题
。
1.
4
数组越界检查
C
语言对数组元素访问时
,
不进行边界检查
,
如
int
a
[
3
]
,
3
p
p
=
a
;
-
-
p
;
.
.
.
.
.
.
p
=
a
;
p
+
=
3
;
.
.
.
.
.
.
这种指令都能执行
,
而不会提示错误
,
所以要自
己控制边界
。
另外二维数组既可以用一级指针
,
也
可以用二级指针访问
[
1
]
。
1.
5
条件判断
如
if
(
a
=
=
5
)
.
.
.
.
;
如果写成
if
(
a
=
5
)
,
系统
不会提示错误
,
软件测试时也测不出问题
。应该养
成这样的编码习惯
:if
(
5
=
=
a
)
。
5
是常量
,
不能被
赋值
,
如果写成
if
(
5
=
a
)
就会提示错误
,
从而防范此
类错误
。
1.
6
关键字
Turbo
C
编译器对关键字不进行高亮显示
,
如
果关键字拼错了
,
而编译又能通过
,
就会引来麻烦
。
如
:switch
结构里把
default
拼写成
default
,
小写字
符
“
l
”
拼写成了数字
“
1
”
,
Turbo
C
编译能通过
。
case
条件都不满足时才会执行
default
语句
,
从而引发异
常
。
如果测试时没有覆盖
default
路径
,bug
就会带
入生产环境
。
最好选用
Visual
C
+
+
等能够高亮显
示关键字的编译器
。