《代码审查案例》PPT课件.ppt
代码审查技术,C/C+代码审查,C/C+语言编码规范C/C+常见代码问题检测,不懂开发怎么做代码审查?,静态分析是指在不执行的情况下对代码进行评估的过程。包括:-类型检查-风格检查-程序理解-BUG查找-安全审查,循环语句的效率,for(row=0;row100;row+)for(col=0;col5;col+)sum=sum+arowcol;,在多重循环中,如果有可能,应当将最长的循环放在最内层,最短的循环放在最外层,以减少CPU 跨切循环层的次数:for(col=0;col5;col+)for(row=0;row100;row+)sum=sum+arowcol;,指针的使用,_UC*puc_card_config_tab;.Get_Config_Table(AMP_CPM_CARD_CONFIG_TABLE,.b_middle_data_ok=generate_trans_middle_data_from_original_data(puc_card_config_tab,Ul_card_config_num).,switch Statement Should Include a Default Case,1.switch(formatType)2.3.case 1:4.formatStr=yyyyMMddHHmmss;5.break;6.case 2:7.formatStr=yyyy-MM-dd HH:mm:ss;8.break;9.case 3:10.formatStr=yyyy.MM.dd HH:mm:ss;11.break;12.case 4:13.formatStr=yyyy年MM月dd HH:mm:ss;14.break;15.,根据编码规范,每个switch流程控制语句都必须带一个default分支,以保证逻辑分支的完整性。如果没有第1516行的default代码,代码审查将给出警告。1.switch(formatType)2.3.case 1:4.formatStr=yyyyMMddHHmmss;5.break;6.case 2:7.formatStr=yyyy-MM-dd HH:mm:ss;8.break;9.case 3:10.formatStr=yyyy.MM.dd HH:mm:ss;11.break;12.case 4:13.formatStr=yyyy年MM月dd HH:mm:ss;14.break;15.default:16.formatStr=yyyy-MM-dd HH:mm:ss;17.,Complex Assignment,1.int i=0;2.int j=0;3.int k=0;4.int l=0;5.i*=+j;6.7.k=j=10;8.9.l=j+=15;10.11.i=j+20;12.13.i=(j=25)+30;14.15.i=j+20;16.17.i=(j=25)+30;,往往有些程序员热衷于将Java的语法发挥到极致,以资其对Java语法精通的凭据。如果是为了练习语法、理解语法,无可厚非。但如果在需要充分协作沟通的软件项目中,简洁明了,清晰易懂将会受到推崇,晦涩难懂的语句将会受到奚落。故此,大部分的软件公司的规范都对语句的精简明了提出了要求。,1.int arr=new intsize;2.if(arr=null)3.4.return null;5.,流程控制中存在不可到达的语句:死代码有些流程控制由于测试条件恒为false,则流程中的程序无法到达。1.int arr=new intsize;2.if(arr=null)/由于arr不为空,则该测试逻辑不可能通过,程序无法进入该程序块中3.4.return null;5.,添加()清晰化复杂的表达式写复杂的表达式时不应过度依赖运算操作符的计算优先顺序,而应养成使用“()”的好习惯,当一个逻辑表达式由多个逻辑运算组成时,应该用“()”划分不同的部分。1.boolean a,b,c;2.3.if(a|b&c)/应该替换成if(a|b)&c)4.5.6.,Coding Style:-Multiple Statements on One Line-Place Statement in Block-Use L instead of l at the End of Integer Constants,1.i+;j+;2 3.if(val=10)6.val/=10;7.8.void func()9.long var=0 x0001111l;10.,不应将多行语句写在同一行代码中。代码块应以“”框起来,虽然增长了代码,但代码结构性更强。声明长整型使用大写的“L”类型指定符,而非小写的“l”,因为后者和数字1相似。,命名规范,骆驼(Camel)帕斯卡(Pascal)匈牙利,“匈牙利”法,该命名规则的主要思想是“在变量和函数名中加入前缀以增进人们对程序的理解”。例如所有的字符变量均以ch为前缀,若是指针变量则追加前缀p。如果一个变量由ppch 开头,则表明它是指向字符指针的指针。,“匈牙利”法的缺点,“匈牙利”法最大的缺点是烦琐,例如int i,j,k;float x,y,z;倘若采用“匈牙利”命名规则,则应当写成int iI,iJ,ik;/前缀 i 表示int 类型float fX,fY,fZ;/前缀 f 表示float 类型如此烦琐的程序会让绝大多数程序员无法忍受。,骆驼式命名法,正如它的名称所表示的那样,是指混合使用大小写字母来构成变量和函数的名字。例如,下面是分别用骆驼式命名法和下划线法命名的同一个函数:printEmployeePaychecks();print_employee_paychecks();第一个函数名使用了骆驼式命名法-函数名中的每一个逻辑断点都有一个大写字母来标记;第二个函数名使用了下划线法-函数名中的每一个逻辑断点都有一个下划线来标记。骆驼式命名法近年来越来越流行了,在许多新的函数库和MicrosoftWindows这样的环境中,它使用得当相多。另一方面,下划线法是c出现后开始流行起来的,在许多旧的程序和UNIX这样的环境中,它的使用非常普遍。,帕斯卡(Pascal),与骆驼命名法类似。只不过骆驼命名法是首字母小写,而帕斯卡命名法是首字母大写,如:public void DisplayInfo();string UserName;二者都是采用了帕斯卡命名法在C#中,以帕斯卡命名法和骆驼命名法居多。,代码审查清单,练习:读代码,找错误,1:2:char*report(short m,short n,char*p)3:4:int result;5:char*temp;6:long nm;7:int i,k,kk;8:char name11=Joe Jakeson;9:10:nm=n*m;11:temp=p=?null:p;12:for(i=0;i 0)result=1;16:else if(kk 0)result=-1;17:if(m=result)return temp;18:else return name;19:,PC-Lint,LINT工具是一种软件质量保证工具,许多国外的大型专业软件公司,如微软公司,都把它作为程序检查工具,在程序合入正试版本或交付测试之前一定要保证通过了LINT检查,他们要求软件工程师在使用LINT时要打开所有的编译开关,如果一定要关闭某些开关,那么要给出关闭这些开关的正当理由。PC-LINT是GIMPEL SOFTWARE公司的产品,其中的内容是非常广泛的,光是选项就有30 0多个,涉及到程序编译及语法使用中的方方面面。,FxCop,FxCop是一款专门用于分析.NET托管代码程序集的工具。它能检查.NET代码是否满足Microsoft.NET Framework 设计规范。它使用反射、MSIL解析等技术来分析程序集,可以检查超过200个缺陷,包括库设计、本地化、命名规范、性能、安全等方面的内容。,FxCop的使用,DevPartner,DevPartner Studio 8.0 Professional Edition是一款与Visual Studio紧密结合的测试工具。它能帮助检测和诊断各种.NET代码问题,包括代码评审(Code Review)、错误检测、性能分析、覆盖率分析、内存分析等功能。,DevPartner的Code Review功能,在Rule Manager中编辑代码规则,DevPartner通过扫描和匹配代码中符合正则表达式的代码来判断代码是否违反了规则,因此可以说正则表达式是制定规则、识别代码缺陷的关键。,JBuilder的Code Audits功能的使用,JBuilder根据Sun的编码规范及软件开发界总结出的一套行之有效的编码习惯,对Java开发中的编码风格、声明风格、Javadoc文档注释、EJB规范、命名风格、潜在错误、编码中的画蛇添足等诸多方面进行代码审查并给出警示,以便开发人员发现这些不足和隐患予以及时更正。,JavaScript代码检查工具-JSLint,