1 / 12
文档名称:

软件编程低级错误:表达式.ppt

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

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

分享

预览

软件编程低级错误:表达式.ppt

上传人:文库旗舰店 2018/9/15 文件大小:633 KB

下载得到文件列表

软件编程低级错误:表达式.ppt

相关文档

文档介绍

文档介绍:*C语言软件编程规范工作组公司常见软件编程低级错误:表达式前言这套材料作为编程规范的辅助材料,帮助大家理解编程规范背后的原理。C和C++语言是我司的主流编程语言,然而C/C++具有很多强大的语言特性,从而导致C/C++非常复杂,使得代码更容易出现BUG、难以阅读和维护。业界知名的编程规范都对C/C++容易出现问题的语言特性进行管理。例如MISRA(汽车工业软件可靠性联合会)制定的1998版的MISRAC规范指出,一些在C看来可以接受,却存在隐患的地方有127处之多。2004版的MISRAC规范将针对C语言的规则增加到了141条。对于程序员来说,能工作的代码并不等于“好”代码。“好”代码的指标很多,包括可读性、可维护性、可移植性和可靠性等。出现网上问题的代码,大多数是不良编程****惯引起的。不遵守编程规范的代码,往往也是最不可靠的代码。本胶片收集了常见的表达式案例,给出了相应的纠正措施。对应的编程规范:表达式的值在标准所允许的任何运算次序下都应该是相同的;用括号明确表达式的操作顺序,避免过分依赖默认优先级表达式使用默认优先级:规则【规则】ISO9899::,不需要使用括号x=~a; /*一元运算符,不需要括号*/x=-a; /*一元运算符,不需要括号*/,如果涉及多种运算符,则应该使用括号x=a+b+c; /*运算符相同,不需要括号*/x=f(a+b,c) /*运算符相同,不需要括号*/if(a&&b&&c) /*运算符相同,不需要括号*/x=(a*3)+c+d;/*运算符不同,需要括号*/x=(a==b)?a:(a–b);/*运算符不同,需要括号*/,如果涉及类型转换或者量级提升,也应该使用括号控制计算的次序以下代码将3个浮点数相加:f4=f1+f2+f3;/*除了逗号(,),逻辑与(&&),逻辑或(||)之外,C标准没有规定同级运算符是从左还是从右开始计算,以上表达式存在2种计算次序:f4=(f1+f2)+f3或f4=f1+(f2+f3),浮点数计算过程中可能四舍五入,量级提升,计算次序的不同会导致f4的结果不同,以上表达式在不同编译器上的计算结果可能不一样,建议增加括号明确计算顺序*/表达式使用默认优先级(1)【问题描述】同一个目录下发布多个频道到一定值后,虽然是计费频道,但实际访问时并没有付费定购提示,好像变成了免费模式【问题定位】问题代码如下:StringcurDirPosition=(longCurDirPosition%100>9)?"":"0"+longCurDirPosition%100;程序的本意是根据longCurDirPosition%100>9的值,输出”longCurDirPosition%100”或者””0”+longCurDirPosition%100”。在换行符的作用下很容易让人以为程序是没有问题的,但实际上程序执行的优先级与作者的期望不符,以上语句等价与:StringcurDirPosition=(longCurDirPosition%100>9)?"":("0"+longCurDirPosition%100);结果将输出””或者”’0’+longCurDirPosition%100”【纠正措施】补充一对括号,修改代码为:StringcurDirPosition=((longCurDirPosition%100>9)?"":"0“)+longCurDirPosition%100;表达式使用默认优先级(2)【问题描述】对密码进行MD5加密的时候,得出来的结果每次都是空。【问题定位】如下代码:ucPwdLen=ucPwdLen&0xf0+0x10;程序执行的实际优先级为:ucPwdLen=ucPwdLen&(0xf0+0x10);【纠正措施】补充一对括号,修改代码为:ucPwdLen=(ucPwdLen&0xf0)+0x10;表达式使用默认优先级(3)【问题描述】香港鉴权二次重同步出现SQN混乱。【问题定位】如下代码:if((+1)&0x01000000>0){……….}由于>运算符优先级大于&,程序执行的实际优先级为:if((+1)&(0x01000000>0))上述if语句恒成立,导致SQN混乱。【纠正措施】补充一对括号,修改代码为:if(((+1)&0x01000000)>0)表达式副作用:移植后出错【问题描述】产品移植到新平台后,下发某命令,配置不成功。【问题定位】问题代码如下:Set_Config_Table(DB_Query(),Get_Next_WD());原来的平台编译器先执行Get_Next_WFD(),后执行DB_Query(),结果正确