C语言中的缺陷与陷阱

C语言中的缺陷与陷阱

(博雅课期末作业:计算机网络安全与防护) 刚进大学,学的第一门计算机语言就是C语言,这是我第一次接触到计算机语言,对它一无所知。有些同学之前已经学过了一些类似的语言,例如VB、PASCAL等等。因为从来没有学过计算机语言,所以在学习C语言的过程中,遇到了很多困难,许多问题都不理解。因此虽然我已经学完了这本书,但是对书中的内容都不知甚解。

学过C语言的人都知道,指针是C语言中的一个重要概念,也是它的一个重要特色。正确而灵活地运用指针,可以有效地表示复杂的数据结构;能动态分配内存;方便地使用字符串;有效而方便地使用数组;在调用函数时能获得一个以上的结果;能直接处理内存单元地址等。掌握指针的应用,可以使程序简洁、紧凑、高效。但是任何事情都有两面性,C语言中的指针也是如此。举几个例子来说:

1.指针与数组

在新的一年里我们需要将日历(calendar)数组清空:

int (*monthp)[31];

for(monthp=calendar;monthp

{

}

在这个程序中用指针monthp以步进的方式遍历数组calendar。使用指针来操纵数组,常常需要跟C语言中最为“晦暗不明”的部分打交道,并常常遭遇到潜伏着的编译器bug。因此使用指针时,我们必须得小心翼翼,否则,程序很容易出错。

2.非数组的指针

有一段程序如下:

char *r,*malloc();

r=mollac(strlen(s)+strlen(t));

strcpy(r,s);

strcat(r,t); int *dayp; for(dayp=*monthp;dayp

这个例子有三个错误:一、malloc函数有可能无法提供请求的内存,这种情况下malloc函数会通过返回一个空指针来作为“内存分配失败”事件的信号。二、给r分配的内存在使用完成之后应该立即释放。三、最重要的是调用malloc函数是并未分配足够的内存。

3.数组边界问题

C语言并不检验数组边界,因此,数组的两端都有可能越界而使其他变量的数据甚至程序代码被破坏。因此对于C语言来说,数组的边界检验是程序员的职责。

C语言中一个拥有n个元素的数组中,却不存在下标为n的的元素,它的元素的下标范围是从0到n-1,使用数组时一定要注意到这一点。

4.表达式求值顺序

一个表达式:a

C中所有其它的运算符对操作数的求值顺序都是未定义的。事实上,赋值运算符不对求值顺序做出任何保证。

5.移位运算符

C语言中,在向右移位时如果被移位的对象是无符号数,那么空出的位将被0填充。如果被移位的对象是有符号数,那么C语言实现既可以用0填充空出的位,也可以由符号位的副本来填充空出的位。

移位计数也有一定的范围限制。如果被移位的对象长度是n位,那么移位计数必须大于或等于0,而严格小于n。因此,不可能做到在单次操作中将某个数值中的所有位都移出。

还要注意的是,即使C语言实现将符号位复制到空出的位中,有符号整数的向右移位运算也不等同于除以2的某次幂。

6.可移植性缺陷

C被很多人实现并运行在很多机器上。这也正是在一个地方写的C程序应该能够很容易地转移到另一个编程环境中去的原因。

然而,由于有很多的实现者,它们并不和其他人交流。此外,不同的系统有不同的需求,因此一台机器上的C实现和另一台上的多少会有些不同。

由于很多早期的C实现都关系到UNIX操作系统,因此这些函数的性质都是专于该系统的。当一些人开始在其他系统中实现C时,他们尝试使库的行为类似于UNIX系统中的行为。

但他们并不总是能够成功。更有甚者,很多人从UNIX系统的不同版本入手,一些库函数的本质不可避免地发生分歧。今天,一个C程序员如果想写出对于不同环境中的用户都有用的程序就必须知道很多这些细微的差别。

为了减少程序的错误,我们可以采取以下一些建议:

1.不要说服自己相信潜在的错误。有些错误极具伪装性和欺骗性。

2.直截了当的表明意图,这样做不仅有利于自己日后读程序,也方便其他人理解程序的用意和维护代码。

3.考察最简单的特例。这一原则适用于构思程序的工作方式,测试程序的工作情况和程序设计

4.使用不对称边界。

5.注意潜伏在暗处的Bug漏洞,避免使用那些“生僻”的语言特性。

6.防御性编程。对程序用户和编译器实现的假设不要过多!

最后总结一下这学期我上博雅课的所得:了解了很多关于安全方面的小软件,如USB dumper,USB cleanner,Flash Disk Alert,ereaser,屏幕录像专家等,学习了文档加密、解密、隐藏,听了有关网络攻击方面的内容,还在课后看了电影《黑客帝国》、《虎胆龙威》、《超人特工队》、《鹰眼》、《防火墙》。此外,我对word的功能也多了一些认识,比如可以对word文档加密、解密,选择性粘贴。这些对我以后在学习中都将会有很大的帮助。

参考文献:《C陷阱与缺陷》Andrew Koenig著

C语言中的缺陷与陷阱

(博雅课期末作业:计算机网络安全与防护) 刚进大学,学的第一门计算机语言就是C语言,这是我第一次接触到计算机语言,对它一无所知。有些同学之前已经学过了一些类似的语言,例如VB、PASCAL等等。因为从来没有学过计算机语言,所以在学习C语言的过程中,遇到了很多困难,许多问题都不理解。因此虽然我已经学完了这本书,但是对书中的内容都不知甚解。

学过C语言的人都知道,指针是C语言中的一个重要概念,也是它的一个重要特色。正确而灵活地运用指针,可以有效地表示复杂的数据结构;能动态分配内存;方便地使用字符串;有效而方便地使用数组;在调用函数时能获得一个以上的结果;能直接处理内存单元地址等。掌握指针的应用,可以使程序简洁、紧凑、高效。但是任何事情都有两面性,C语言中的指针也是如此。举几个例子来说:

1.指针与数组

在新的一年里我们需要将日历(calendar)数组清空:

int (*monthp)[31];

for(monthp=calendar;monthp

{

}

在这个程序中用指针monthp以步进的方式遍历数组calendar。使用指针来操纵数组,常常需要跟C语言中最为“晦暗不明”的部分打交道,并常常遭遇到潜伏着的编译器bug。因此使用指针时,我们必须得小心翼翼,否则,程序很容易出错。

2.非数组的指针

有一段程序如下:

char *r,*malloc();

r=mollac(strlen(s)+strlen(t));

strcpy(r,s);

strcat(r,t); int *dayp; for(dayp=*monthp;dayp

这个例子有三个错误:一、malloc函数有可能无法提供请求的内存,这种情况下malloc函数会通过返回一个空指针来作为“内存分配失败”事件的信号。二、给r分配的内存在使用完成之后应该立即释放。三、最重要的是调用malloc函数是并未分配足够的内存。

3.数组边界问题

C语言并不检验数组边界,因此,数组的两端都有可能越界而使其他变量的数据甚至程序代码被破坏。因此对于C语言来说,数组的边界检验是程序员的职责。

C语言中一个拥有n个元素的数组中,却不存在下标为n的的元素,它的元素的下标范围是从0到n-1,使用数组时一定要注意到这一点。

4.表达式求值顺序

一个表达式:a

C中所有其它的运算符对操作数的求值顺序都是未定义的。事实上,赋值运算符不对求值顺序做出任何保证。

5.移位运算符

C语言中,在向右移位时如果被移位的对象是无符号数,那么空出的位将被0填充。如果被移位的对象是有符号数,那么C语言实现既可以用0填充空出的位,也可以由符号位的副本来填充空出的位。

移位计数也有一定的范围限制。如果被移位的对象长度是n位,那么移位计数必须大于或等于0,而严格小于n。因此,不可能做到在单次操作中将某个数值中的所有位都移出。

还要注意的是,即使C语言实现将符号位复制到空出的位中,有符号整数的向右移位运算也不等同于除以2的某次幂。

6.可移植性缺陷

C被很多人实现并运行在很多机器上。这也正是在一个地方写的C程序应该能够很容易地转移到另一个编程环境中去的原因。

然而,由于有很多的实现者,它们并不和其他人交流。此外,不同的系统有不同的需求,因此一台机器上的C实现和另一台上的多少会有些不同。

由于很多早期的C实现都关系到UNIX操作系统,因此这些函数的性质都是专于该系统的。当一些人开始在其他系统中实现C时,他们尝试使库的行为类似于UNIX系统中的行为。

但他们并不总是能够成功。更有甚者,很多人从UNIX系统的不同版本入手,一些库函数的本质不可避免地发生分歧。今天,一个C程序员如果想写出对于不同环境中的用户都有用的程序就必须知道很多这些细微的差别。

为了减少程序的错误,我们可以采取以下一些建议:

1.不要说服自己相信潜在的错误。有些错误极具伪装性和欺骗性。

2.直截了当的表明意图,这样做不仅有利于自己日后读程序,也方便其他人理解程序的用意和维护代码。

3.考察最简单的特例。这一原则适用于构思程序的工作方式,测试程序的工作情况和程序设计

4.使用不对称边界。

5.注意潜伏在暗处的Bug漏洞,避免使用那些“生僻”的语言特性。

6.防御性编程。对程序用户和编译器实现的假设不要过多!

最后总结一下这学期我上博雅课的所得:了解了很多关于安全方面的小软件,如USB dumper,USB cleanner,Flash Disk Alert,ereaser,屏幕录像专家等,学习了文档加密、解密、隐藏,听了有关网络攻击方面的内容,还在课后看了电影《黑客帝国》、《虎胆龙威》、《超人特工队》、《鹰眼》、《防火墙》。此外,我对word的功能也多了一些认识,比如可以对word文档加密、解密,选择性粘贴。这些对我以后在学习中都将会有很大的帮助。

参考文献:《C陷阱与缺陷》Andrew Koenig著


相关文章

  • 驳"人性自私"论
  • 驳"人性自私"论 刘 英 [摘 要]当前人们的思想空前混乱,以"人性自私"论作为立论根据的资本主义五论广泛流行,在意识形态领域潜伏着资本主义和平演变的危险性.本文通过创立科学的人性论,破除抽象公私观陷 ...查看


  • 如何帮孩子做试卷分析
  • 语文:加点字注音-1 修辞方法-2 (概念基础)阅读理解语言表述-3 作为-1 数学:理解错误-2(该种错误是很少范得) 英语:选择题-1,完型填空-2,(概念基础)阅读理解-2(审题不清) ∙ 审题不认真-9,是失分最多的,况且以理科知识 ...查看


  • 全球化与中国青少年民族意识的弱化
  • Northwestpopulation 2009年第1期第30卷 全球化与中国青少年民族意识的弱化 孙 朝 阳 (安阳师范学院历史与社会发展学院,河南,安阳455000) 摘要:全球化浪潮不可避免的对我国青少年的民族意识形成了负面影响,在经 ...查看


  • 微电子器件可靠性习题
  • 微电子器件可靠性习题 第一.二章 数学基础 1.微电子器件的可靠性是指产品在:完成能 的能力. 2.产品的可靠度为R(t).失效概率为F(t),则二者之间的关系式为. 3.描述微电子器件失效率和时间之间关系的曲线通常为一"浴盆&q ...查看


  • 谈谈英国留学中介费用
  • 根据资深英国留学机构 - 优越教育的王老师表示,虽然中介费不是消费者选择留学中介惟一的标准,但是中介费仍然是相当关键的一个因素.英国留学前期的中介费用一直是家长们比较关心的,明智的消费者,应该要认清每个中介机构的收费结构与收费合理性,懂得识 ...查看


  • 刘恩科 半导体物理第二章 讲义
  • 第二章 半导体中杂质和缺陷能级 z重点 理想半导体的能带 禁带无能级 Ec 禁带 z 2.1 硅.锗晶体中的杂质能级 允带 禁带 Ev z 2.2 Ⅲ-Ⅴ族化合物中的杂质能级 理想半导体:晶体中原子周期性规则排列在固定的格点. 2 非理想( ...查看


  • [语言的功能与陷阱]读后感(更改篇)
  • <语言的功能与陷阱>读后感语言之所以存在,必然有其功能.从王蒙的<语言的功能与陷阱>当中显示,语言最常见的功能就是表达.交流.记录以及记忆的功能.我们的日常对话就是语言在发挥表达,交流的功能.我们把语言写到纸上,或雕 ...查看


  • 语言的功能与陷阱
  • 教学课题:语言的功能与陷阱 (王蒙) 教学目标:1.理解课文,了解语言的功能与陷阱. 2.学习作者演讲的风格,并运用于实际. 教学重点:了解语言的功能与陷阱,更好的运用语言. 教学难点:学习作者演讲的风格进行演讲. 教学方法:阅读 讨论 讲 ...查看


  • 中等收入陷阱概念不合理
  • "中等收入陷阱"概念不合理 赵亮亮  2013-04-09 10:34:49 来源:<中国社会科学报>总第436期 [核心提示]我们看到,各国的经济差异很大,发展模式.历史背景各不相同.用一个"中 ...查看


热门内容