1 / 35
文档名称:

华为软件编程低级错误杂项.pptx

格式:pptx   大小:459KB   页数:35页
下载后只包含 1 个 PPTX 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

华为软件编程低级错误杂项.pptx

上传人:薄荷牛奶 2019/12/31 文件大小:459 KB

下载得到文件列表

华为软件编程低级错误杂项.pptx

文档介绍

文档介绍:2019/12/25PSST系统工程部C语言软件编程规范工作组公司常见软件编程低级错误:杂项前言这套材料作为编程规范的辅助材料,帮助大家理解编程规范背后的原理。C和C++语言是我司的主流编程语言,然而C/C++具有很多强大的语言特性,从而导致C/C++非常复杂,使得代码更容易出现BUG、难以阅读和维护。业界知名的编程规范都对C/C++容易出现问题的语言特性进行管理。例如MISRA(汽车工业软件可靠性联合会)制定的1998版的MISRAC规范指出,一些在C看来可以接受,却存在隐患的地方有127处之多。2004版的MISRAC规范将针对C语言的规则增加到了141条。对于程序员来说,能工作的代码并不等于“好”代码。“好”代码的指标很多,包括可读性、可维护性、可移植性和可靠性等。出现网上问题的代码,大多数是不良编程****惯引起的。不遵守编程规范的代码,往往也是最不可靠的代码。整数溢出:整数上溢(1)【问题描述】测试人员在测试流的读写时,先写入4294967295长度的数据,,从流中取数据,coredump【问题定位】问题代码如下:intCBufferedStream::read(TString&v){……if(read(nDataLen)!=0){return-1;}if(nDataLen+m_currReadPos>m_MaxDataSize){/*nDataLen为4294967295,nDataLen+m_currReadPos超出整数上限,成为负数,不会return-1*/return-1;}((constChar*)m_pData+m_currReadPos,nDataLen);/*nDataLen为4294967295,内存访问越界*/}【纠正措施】,从而避免了上溢:if(nDataLen>m_MaxDataSize-m_currReadPos)整数溢出:整数上溢(2)【问题描述】代码飞检发现如下代码:m_wSerialID++;【问题定位】当m_wSerialID等于WORD类型的最大值65535时,m_wSerialID++等于0,但0有特殊含义,正常的序列号不允许为0。【纠正措施】增加最小值检查,修改后代码如下:m_wSerialID++;If(MIN_SERIAL_ID>m_wSerialID){m_wSerialID=MIN_SERIAL_ID;}整数溢出:整数下溢【问题描述】处理PPP用户的LCP协商报文时系统发生异常【问题定位】问题代码如下:/*报文长度减去FSM头的长度*/ulLen-=FSM_HDRLEN;处理过短报文时,ulLen的长度可能小于FSM_HDRLEN,减法的结果小于0。由于ulLen是无符号数,结果返回了一个很大的ULONG数值。【纠正措施】增加长度检查,修改后代码如下:If(ulLen<FSM_HDRLEN){returnVOS_ERROR;}ulLen-=FSM_HDRLEN;整数溢出:使用危险函数atoi【问题描述】代码飞检发现如下代码:OutArray[ParaNum]=(UCHAR)atoi((constchar*)TmpPara);ESS;/*注:在父函数中判断OutArray[ParaNum]的值是否合法(必须在1-21范围内)*/【问题定位】atoi函数的源代码如下:inttotal;/*currenttotal,最后返回转换结果*/....while(isdigit(c)){total=10*total+(c-'0');/*accumulatedigit*/c=(int)(unsignedchar)*nptr++;/*getnextchar*/}在语句total=10*total+(c-‘0’)中,没有检测整数的范围,直接计算10*total,如果输入一个超过int范围的数字,则total整数溢出,可能是任意值。可能正好在合法值范围内。【纠正措施】使用strtol代替atoi。strtol内部会检测overflow,超出范围时返回INT_MAX,并且设置全局变量errorno。【举一反三】atoi,atol,atof等函数,都不检测overflow,应该禁止使用这类函数。函数参数中隐含的类型转换:长度截断【问题描述】测试PS的××流程,程序异常退出;【问题定位】在把消息长度作为函数参数传递时,函数调用过程中进行了两次隐含的类型转换(unsignedint32→unsignedint16→unsignedint32),导致数据被截断。【纠正措施】修改函数原型定义,消息长度的参数全部为unsignedint32。函数参数中隐含的