浅谈C语言中影响程序安全性的几点因素

来源 :计算机光盘软件与应用 | 被引量 : 0次 | 上传用户:adamsqiu
下载到本地 , 更方便阅读
声明 : 本文档内容版权归属内容提供方 , 如果您对本文有版权争议 , 可与客服联系进行内容授权或下架
论文部分内容阅读
  摘要:本篇文章主要针对C语言中影响程序安全性的几点因素进行了阐述,以期为其他程序员的编程工作提供参考。
  关键词:C 语言;安全性;程序设计
  中图分类号:TP312.1文献标识码:A文章编号:1007-9599 (2013) 06-0000-02
  随着社会经济的不断发展,计算机技术也在不断的提高,但是在这个过程中,黑客攻击技术以及病毒的涌现,人们发现使用C语言来实现的程序,以及操作系统,都或多或少的存在着一定的缺陷和漏洞,除了这些程序和系统会因为缺陷的出现的而崩溃、瘫痪以外,这些缺陷和漏洞还会被病毒、黑客所利用并对用户的计算机进行攻击的情况,因此,C语言编程人员必须要完全清楚C语言自身所有特点与缺点,这样才能够设计出安全、高效的程序。
  1C语言中的陷阱
  1.1类型及转换
  C语言的自身基本类型的长度并不是固定的,而是依据所运行的系统来判定。在确定类型大小的过程中,一般有以下几个通用的原则:: sizeof(char) ≤sizeof ( short) ≤sizeof (int ) ≤sizeof (long);sizeof ( float ) ≤ sizeof ( double ) ≤ sizeof ( longdouble) ; sizeof (char) ≤sizeof (wchar) 。一般任意2个类型的值都是能够直接转换,但是当大类型的语言向小类型的语言转换的过中,可能就会出现一定的错误,因此,在进行类型转换的过程中要防止进行强制的转换。同时还需要注意的是 double和 float这两个类型都是不精确的。
  1.2void 类型
  C 语言有void 类型,但没有void 类型的变量。viod 不是0 ,不是空字符串,也不是NULL 。void m ; / / 错误,没有void?类型的变量void 3 pv ; / / pv 是指针,执行的类型不确定void f ( ) ; / / 函数f 不返回值
  1.3缓冲区溢出
  如下语句:char a; scanf ( " %s" , a) ,如果输入字符超过10 个,如输入:abcdabcdabcd ,则会出现缓冲区溢出的情况。在之后多输入数据会直接覆盖掉缓冲区内部前后的内存单元内容,具体覆盖的位置根据操作系统而定,所引发的后果根据操作系统当时实际所处的状态而定。如果缓冲区内当时存在的是毫无用处的数据,那么操作系统就不会出现较为严重的故障;但是如果缓冲区内当时所存在的数据是计算机正在占用的数据,正在使用该数据的并运行的程序就会出现运行错误;如果说是发出的指令出现了错误,那么计算机系统就会无响应甚至直接崩溃。
  1.4指针
  在C语言中,指针是一项功能极为强大的操作符,有着较为灵活的特性,操作简单,并且通过该方法能够直接访问到硬件设备以及内存单元之中去,同时有些操作还必须要通过指针才能够实现预期的效果。
  防御式编程是一种较为保守的编程方式,通过这种编程方式能够极为有效防止程序出现异常错误,增强系统自身的稳定性。例如程序的生产环节要求高,那就可以使用防御式编程法;而如果程序的生产坏境安全性的要求并不高,没有严格的要求,并且对于程序自身的性能有着较高的要求,那么就不应该使用防御式编程法,因为防御式编程法主要起的是防御的目的,不然就会降低系统自身的性能。
  在系统进行运作的过程中,必须要先仔细的检测打开文件、打开网络连接、访问I/ O设备、内存分配这几个主要项目的运行是否完全正常,如果说这几个主要项目的操作已经失败了,任然强制运行,那么就会导致计算机系统出现崩溃的现象,正常情况下,程序在失败之后应该设置通知栏来告知用户应该进行程序重启或者重启操作系统的提示。如果说内存分配不正确,并且没有对现象进行处理,那么在这个时候对指针进行操作就会导致操作系统出现错误。例如以下情况:
  int 3 p ;
  p = (int 3 ) malloc ( sizeof (int) ) ;
  if ( p = = null) . . . ;/ / 分配不成功,进行处理. . .
  el se . . .
  2内存泄露
  内存泄露就是指计算机的堆内存发生了泄露,堆内存指的就是应用程序从堆中所分配的任意大小的、程序使用完毕之后要将内存完全释放。这些应用程序通常都是使用malloc, new, realloc 等函数来从堆中分配得到一部分内存,这部分内存在程序使用完成之后,程序必须要复杂将free 或delete进行调用,从而完全释放出程序所使用的内存,如果不通过这样的模式来运行,那么这一部分被占用的内存就无法被其他程序使用,这时候我就们就称其为内存泄露。
  有这样一个程序:
  #include "stdlib.h"
  void gm( char **p,int n)
  { *p=(char*)malloc(n);
  }
  main( )
  { char *s=NULL;
  gm(&s,80);
  strcpy(s, "China Beijing ");
  printf(s);
  }
  在对改程序进行执行的操作之后,虽然能够输出“China Beijing ”的字符效果,但是这项程序被数次调用之后,并且其他程序也没有运行的情况下,该程序的内存占用率异常的加大,事实上导致这种情况出现的原因就是该程序出现了内存泄露的现象。
  从以上对于程序内存泄露程序定义来看,都是在gm( )仅仅只是使用malloc函数来进行内存的分配。并且在使用完内存之后,没有使用free 函数来释放出所占用的内存,最终导致了内存泄露的情况出现。如果说程序在运行的过程中,过多的调用gm( )函数那就会使得系统较多的内存都被占用,并且得不到良好的释放,从而使得系统的内存占用率出现突然暴增的情况。这是导致内存泄露情况出现的一种常见情况。
  通过以上我们可以明显的看出,防止出现内存泄露的最有效的方法就是通过malloc 函数来进行内存的分配工作,并且使用完毕之后所占用的内存能够通过free函数来快速的释放。
  3指针的有效性
  请看以下这段程序:
  #include "stdio.h"
  char *getm(void)
  {
  char p[ ]= "hello world";
  return p;
  }
  main()
  {
  char *str= NULL;
  str=getm();
  printf("%s ",str);
  该案例的本意是希望把最后输出的结果显示成为“hello world”这样一个字符串,但是在从实际操作的结果来看,却是出现了乱码的现象。对这个现象进行简单的分析之后,我们发现,主要是由于char p[ ]="hello world"这串字符所导致的,这条语句所分配的存储空间中的"hello world"这个字符串是在栈中进行分配的,而*getm(void)则是属于能够返回针值的一种函数,当函数*getm()返回的过程中,已经被分配的空间就会被释放出来,但是之前所存储的内容也不会被销毁,但是printf("%s ",str); 这串字符由于涉及到了系统调用的原因,其中有数据压栈的存在,会将以前分配给数据组p[ ]的存储空间中的内容进行修改,从而导致了程序在运行的过程中,无法达到预设的效果。
  解决方法是将*getm()函数体中的char p[ ]="helloworld"程序行改成char * q= "hello world",则执行main()的时候就可以正确输出"hello world",这是由于q 指向的是静态数据区,而不是栈中某个单元。
  所以说,数组名p虽然说是指针,但是在将其实现的过程中依然存在着一定的差异。因此,在使用指针进行编程的过程中必须要注意的是:动态分配的对象,不能够在本对象消亡之后就将其传递给另外一个对象
  4结束语
  C语言自身有着极高的灵活性、高效性,这也是C语言的一个巨大优势,但是,由于这些特性的原因,导致了C语言在一定程度上牺牲了自身的健壮性、安全性、稳定性,因此,在应用C语言的过程中,必须要完全了解该语言自身的特性,以及该语言自身缺陷所可能导致的安全漏洞,只有完全了解C语言的各项特性,才能在进行编程、测试的过程中最大限度的提升所编程序的安全性。
  参考文献:
  [1]谭浩强.C 程序设计[M].北京:清华大学出版社,2004.
  [2]STROUSTRUPB.C++程序设计语言特别版[M].北京.机械工业出版社,2004.
  
其他文献
【摘要】 本文简要探讨了UPS系统的基础知识和选型时的几个注意点,为我们在规划设计广播电视机房或采购UPS设备时提供依据。  【关键词】 UPS电源 数字化 模式  一、引言  广电行业向信息化、数字化、网络化发经过几十年的发展,我国的广播电视事业得到了长足的发展,加速了广播电视发展的步伐,机房内各类制作、播出、前端设备已经由大量的服务器、数据交换器等数字设备构成。大量计算机技术应用于广播电视电设
奶牛红尿病在临床上常见,而低磷性红尿病与其他红尿病的症状较难区别,常易引起误诊。奶牛低磷性红尿病是指由于饲料中磷含量不足或牛体内磷的消耗量增加而补充不足引起的一种
大通牦牛是在高原高寒自然生态条件下用人工培育成功的牦牛新品种。该品种具有生产性能高、生长发育快、特别是产肉高、繁殖好、抗逆强、体型外貌高度一致、遗传性能稳定等特
据悉。为控制畜禽养殖污染,促进养殖业持续健康发展,长沙市将出台政策采用以奖代补的形式.从2008年开始对四县(市)范围内存栏生猪1000头、年出栏3000头以上的养猪场(户)和年出栏生猪
近日,记者从成都海关获悉,2010年四川共出口鲜、冷、冻猪肉(以下简称猪肉)2.3万吨,价值6070万美元,分别较去年同期增长25%和20.1%。整体来看,全年猪肉出口规模趋稳回升、出口价格平缓运
在众多的科学领域.航天事业以其独有的征服宇宙的魅力吸引着人们关注的目光。航天科技在征服宇宙的同时.还在很大层面上悄然改变着人类的生活。这种不知不觉的改变究竟体现在何
据悉.湖北省应城市以“一卡通”的方式将2008年生猪小额贷款贴息资金19万元陆续发放到养殖户手中,这是该市在当前养殖行情低迷态势下,积极应对危机,帮助养殖业主化解养殖风险的又
本文构建了一种基于ARM9内核的S3C2410作为核心处理芯片与嵌入式Linux操作系统的图像信息采集与传输系统平台,整个平台由服务器端和客户端两部分组成。服务器端的USB接口摄像头用于图像的获取,无线传输模块配合核心处理器完成图像的处理及发送。客户端完成图像的接收及显示。本文阐述了构建硬件平台的核心处理器,GPRS模块等的工作原理及软件实现方法。
本文主要讲述响应式网站的优势及实现步骤。
5.12汶川大地震后,成都市首家现代化综合型屠宰加工企业四川康绿食品公司,2009年4月5日在彭州市濛阳镇农业园区建成投产。该企业是按照五星级屠宰企业标准,参照欧美注册的生