华为软件编程低级错误:杂项课件.ppt

华为软件编程低级错误:杂项课件.ppt

ID:56973261

大小:413.50 KB

页数:35页

时间:2020-07-25

华为软件编程低级错误:杂项课件.ppt_第1页
华为软件编程低级错误:杂项课件.ppt_第2页
华为软件编程低级错误:杂项课件.ppt_第3页
华为软件编程低级错误:杂项课件.ppt_第4页
华为软件编程低级错误:杂项课件.ppt_第5页
资源描述:

《华为软件编程低级错误:杂项课件.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、PSST系统工程部C语言软件编程规范工作组公司常见软件编程低级错误:杂项2021/8/25前言这套材料作为编程规范的辅助材料,帮助大家理解编程规范背后的原理。C和C++语言是我司的主流编程语言,然而C/C++具有很多强大的语言特性,从而导致C/C++非常复杂,使得代码更容易出现BUG、难以阅读和维护。业界知名的编程规范都对C/C++容易出现问题的语言特性进行管理。例如MISRA(汽车工业软件可靠性联合会)制定的1998版的MISRAC规范指出,一些在C看来可以接受,却存在隐患的地方有127处之多。2004版的MISRAC规范将针对C语言的规则增加到了141条。对于程序员来说,能工

2、作的代码并不等于“好”代码。“好”代码的指标很多,包括可读性、可维护性、可移植性和可靠性等。出现网上问题的代码,大多数是不良编程习惯引起的。不遵守编程规范的代码,往往也是最不可靠的代码。整数溢出:整数上溢(1)【问题描述】测试人员在测试流的读写时,先写入4294967295长度的数据,然后写入少量数据.写入成功后,从流中取数据,coredump【问题定位】问题代码如下:intCBufferedStream::read(TString&v){……if(read(nDataLen)!=0){return-1;}if(nDataLen+m_currReadPos>m_MaxDataSi

3、ze){/*nDataLen为4294967295,nDataLen+m_currReadPos超出整数上限,成为负数,不会return-1*/return-1;}v.assign((constChar*)m_pData+m_currReadPos,nDataLen);/*nDataLen为4294967295,内存访问越界*/}【纠正措施】考虑到代码逻辑中m_currReadPos不可能大于m_MaxDataSize.所以将加法表达式改成减法表达式,从而避免了上溢:if(nDataLen>m_MaxDataSize-m_currReadPos)整数溢出:整数上溢(2)【问题描述

4、】代码飞检发现如下代码: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的长

5、度可能小于FSM_HDRLEN,减法的结果小于0。由于ulLen是无符号数,结果返回了一个很大的ULONG数值。【纠正措施】增加长度检查,修改后代码如下:If(ulLen

6、】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内部会检测overflo

7、w,超出范围时返回INT_MAX,并且设置全局变量errorno。【举一反三】atoi,atol,atof等函数,都不检测overflow,应该禁止使用这类函数。函数参数中隐含的类型转换:长度截断【问题描述】测试PS的××流程,程序异常退出;【问题定位】在把消息长度作为函数参数传递时,函数调用过程中进行了两次隐含的类型转换(unsignedint32→unsignedint16→unsignedint32),导致数据被截断。【纠正措施】修改函数原型定义,消息长度的参数全部为uns

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。