欢迎来到天天文库
浏览记录
ID:28512012
大小:35.00 KB
页数:9页
时间:2018-12-11
《常见编程错误.doc》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、常见编程错误我们总结出一些简单而常见的编程错误,特列举出其中可能造成潜在危害的例子以供参考,希望对各位有所帮助。一、指针及内存申请、释放指针被定义时,就像是拥有了一块指路牌,不同类型的指针将被用来指向不同类型的实物,恰如景点类指示牌指向某个景点,售票处类指示牌指向售票处,这些不同类型的指示牌(不同类型的指针)刚建立时都是白板,也就是其指向是未定义的,这时千万不能直接使用。例:u8dfd2_10Cmd_CheckEraseBlockSuccess(u16*pp_AdrrBeginErase){……volatileu16*pl_Adress_O
2、f_Erase;do{vl_Data1=*pl_Adress_Of_Erase;//Dangerous!!!……其中的指针pl_Adress_Of_Erase尚未指向任何东西就开始被使用了,危险。要使用这些指示牌的第一个工作就是在上面画上与该类型指示牌对应类型的实物的图像或文字,比如“飞来峰”,同时把指示牌的箭头指向飞来峰的方向(这就是给指针赋值,让其指向实物)。改变指针的值就比如将指示牌的内容重新刷成“西湖”,同时把指示牌的箭头扳过去。除非强制指定类型,否则这块用于指示景点的指示牌是不能用于指向非景点的。有时,指针的指向实物要在用时才建立
3、起来的,比如建立一个指针,让它指向临时缓存,这个缓存是临时的,那么就需要立刻建立起来,通常我们可以利用malloc来申请一块内存,要注意的是,这块内存的内容是随机的,因此需要清理才能使用(使用memset等)。类似的过程是:我们要新建景点,首先要申请获得一块土地,刚申请得到的土地上杂草丛生(需要清除干净),然后指示牌将被刷成“新景点”并将箭头指向新的土地,这样别人就可以通过指示牌找到对应的土地进行处理了。一个低级的错误经常发生在这样的情况:我们拥有了一块白板的指示牌,未指向任何地方,但是编程者十分清楚该指示牌将被用来指向“新景点”。在新景点
4、的土地尚未申请的情况下,我们发出一个动工命令,希望其中的推土机去铲平那块新景点的土地,于是危险的情况发生了!白板指示牌的箭头当前所指方向是不确定的(新建指针的指向是随机的),推土机按照这个胡乱的指向开始去铲除!这种情况在很多运行环境下将导致严重的非法操作!如果指针指向的内存是动态申请得来的,在使用完毕时应该将内存释放掉,同时该指针的内容应该设为NULL(相当于擦除指示牌内容,包括其箭头指向),这样可以让调用者发现指针为空而报错并暂停处理。拿“新景点”的指示牌为例,若新景点的土地已收回而指示牌不更新,别人按照指示牌的指向继续进行访问(比如加盖
5、一幢楼),这将造成严重的后果!指针是有生存期的,常常我们会建立一些局部(比如函数内或循环内等等)的指针,那么这些指针的生存周期也就在该局部中,如果这些指针所指向的申请的内存,在该段局部程序结束前没有释放,那么指针消亡时指向的内存还被程序占用,若该内存已经没有被其它指针所指向,就导致了内存的泄漏。特别对一个长时间运行的程序而言,每次运行这一段程序就申请一段内存,但是有借无还,不久内存就会因被申请完而崩溃(在Windows系统中,物理内存用完时会将硬盘作为虚拟内存,所以还可抵挡一阵,但系统性能迅速下降),内存申请与释放的机制没有理顺,再多的内存
6、终将迅速导致崩溃。二、数组超界数组的长度若为N,则可以访问的数组下标为0~(N-1),这一点常常由于粗心而被疏忽导致超界。例:“mms_ui_retrieve_hndlr.c",line2320:Warning:C2914W:out-of-boundoffset32inaddressvoidmms_ui_get_mm_contents_conf_hndlr(…)(*(text_file_names+index)).file_name[FS_MAX_FILENAME_SIZE]=0;//shouldbeFS_MAX_FILENAME_SIZE
7、-1!!!!另外一个原因是由于扩展或其它修改,导致定义和使用不一致造成超界。最常见的就是定义数组时用了宏来表示长度,而程序中使用的地方却直接用数字作为下标,一旦数组的长度由于宏被改变而改变,这些直接以数字作为数组下标访问的程序总会产生问题,访问范围超出数组将导致严重的后果。例:hfd1sem.cu32hfd1_1InitStartMode()a_EraseSector[TYPE_16K]=a_AddressSector[i].v_AddressBeginSector;而相关定义为:#defineNB_ERASE_SECTOR0x02GLOB
8、ALu32a_EraseSector[NB_ERASE_SECTOR];#defineTYPE_64K0x00#defineTYPE_8K0x01#defineTYPE_16K0
此文档下载收益归作者所有