C核心指南P7尽早捕获运行时错

ios开发求职招聘微信群 http://www.bcutexas.net/chaoliu/xinchao/1608.html

这条指南背后的原因是尽早发现错误,避免导致诡异的bug。

以下程序传给incment1数组指针和数组大小作为参数。如果数组大小不小心写错了,会导致数组越界。程序可能会继续执行,但是随时可能运行奔溃。

#includeiostamusingnamespacestd;voidincment1(int*p,intn)//bad:error-prone{for(inti=0;in;++i)++p[i];}voiduse1(intm){constintn=10;inta[n]={};for(inti=10;im;i++)couta[i]"";coutendl;incment1(a,m);//maybetypo,maybem=nissupposed//butassumethatm==20for(inti=10;im;i++)couta[i]"";coutendl;}intmain(){use1(20);turn0;}

以下代码用了span,但是数组大小还是分开设置了,依然会导致越界访问:

#includeiostam#includegsl/gslusingnamespacestd;usingnamespacegsl;voidincment2(spanintp){for(intx:p)++x;}voiduse2(intm){constintn=10;inta[n]={};for(inti=10;im;i++)couta[i]"";coutendl;incment2({a,m});//maybetypo,maybem=nissupposedfor(inti=10;im;i++)couta[i]"";coutendl;}intmain(){use2(20);turn0;}

00-

直接传递一个带数组长度信息的span给incment2就不会出错了:

#includeiostam#includegsl/gslusingnamespacestd;usingnamespacegsl;voidincment2(spanintp){for(intx:p)++x;}voiduse2(intm){constintn=10;inta[n]={};for(inti=0;im;i++)couta[i]"";coutendl;incment2(a);//thenumberofelementsofaneednotbepeatedfor(inti=0;im;i++)couta[i]"";coutendl;}intmain(){use2(20);turn0;}

以下代码定义了Date对象,在user2中,获取到了Date却又把它转成string。之后,又用extract_date把string转成Date。做了一次多余的数据转换操作,实在没有必要。

Datead_date(istamis);//addatefromistamDateextract_date(conststrings);//extractdatefromstringvoiduser1(conststringdate)//manipulatedate{autod=extract_date(date);//...}voiduser2(){Dated=ad_date(cin);//...user1(d.to_string());//...}

注意事项:

避免多余的、过早的检查

避免在O(1)算法中添加O(n)的检查

查看指针和数组:是否进行范围检测,检测是否重复多多余?

查看类型转换:能否避免窄化转换?

查看未检测的输入值

查看结构化数据是否又转成字符串使用?

kimim


转载请注明:http://www.aierlanlan.com/rzfs/579.html