c语言不安全库_C语言安全性缺陷

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

+

+

等能够高亮显

示关键字的编译器

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值