好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

C++代码评审(Code Review)等级标准

C++代码评审(Code Review)等级标准

C++代码评审(Code Review)等级标准

C++代码评审(Code Review)等级标准

0 前言

记录的问题都是来源于平常C++编码过程之中常见或基础的缺陷。

只是由个人整理而成的标准,用于平常代码编写中的“扫雷”,没有权威性,现应用于我的开发团队。

后续的补充完善还是一个漫长的过程。

程序员要善于记录和总结,这样才能成长和提升。

1 简介

代码评审定义 :通过阅读代码检查代码缺陷的质量保证过程。

代码评审内容 :编程规范,重构方法,架构设计,性能安全,日志,可读性,扩展性。。。

代码评审好处 :及早发现编码缺陷,分析编码缺陷,提升代码质量,提高编码水平,促进团队合作。。。

代码评审形式 :代码走读,代码讲解,结对编程,交叉评审,专家评审,评审会议(只发现问题,不在会议上讨论和解决问题)。。。

2 等级标准

一般分三种等级:

严重 :会引起系统死机,程序崩溃,功能不可用,导致严重后果的问题。

一般 :会引起功能部分不可用,设计缺陷,运行效率的问题。

提示 :会引起代码可读性差,违反编程规范的问题。

3 严重等级及问题示例

 1  )
问题类型:操作空指针
问题示例:
CTestClass  *p =  NULL;
p ->GetName(); //  操作空指针 

 2  )
问题类型:操作非法指针
问题示例:
  char  *p =  new   char [ 100  ];
delete p;
memcpy(p,  "  你好  " ); //  操作非法指针 

 3  )
问题类型:指针未判断为空
问题示例:
  if (NULL == P); //  要有指针判断为空 

 4  )
问题类型:野指针
问题示例:
new和delete应成对出现
malloc和free应成对出现 

 5  )
问题类型:死循环
问题示例:
 while  (...)
{
    i ++; //  i++保证不会死循环 
}; 

 6  )
问题类型:逻辑错误
问题示例:
指代码逻辑混乱或相关 

 7  )
问题类型:资源泄漏
问题示例:
CDialog::Create要有CWnd::DestroyWindow来释放
CreateIcon、GetIcon要有DestroyIcon来释放
CBitmap LoadImage要有DeleteObject来释放 

 8  )
问题类型:数组越界
问题示例:
  char   szArray[MAX];
printf(  "  %c  " ,szArray[MAX]); //  数组越界 

 9  )
问题类型:循环体内改写循环变量
问题示例:
  for ( int  i= 0 ;i<MAX;i++ )
{
    i  =  100 ; //  循环体内改写循环变量
} 

 10  )
问题类型:IO操作、数据库操作资源未释放
问题示例:
打开的操作必须要关闭,open()和close()操作应成对出现。 

 11  )
问题类型:判断无符号数是否小于0
问题示例:
UInt iLen  =  MAX;
  if (iLen <  0 ) //  判断无符号数是否小于0 
 {
    ...
} 

 12  )
问题类型:内存拷贝忽略结尾标志  '  \0  '  
问题示例:
  char  *s =  "  aaaa  "  ;
  char  a[ 4  ];
memcpy(a,s,  4 ); //  内存拷贝忽略结尾标志'\0' 

 13  )
问题类型:函数内部修改形参
问题示例:
string GetName(  int   iID)
{
    iID  =  100 ; //  函数内部修改形参 
     ...
} 

 14  )
问题类型:new数组,delete无[]
问题示例:
  char  *a =  new   char [ 100  ];
...
delete a;  //  new数组,delete无[] 

 15  )
问题类型:局部变量和局部变量、函数参数、全局变量重名

  16  )
问题类型:对象不能用memset初始化

  17  )
问题类型:多线程资源未做互斥处理

  18  )
问题类型:代码圈复杂度不能高于14

  19  )
问题类型:函数代码嵌套级数不能超过6

  20  )
问题类型:调试或日志信息中不能有敏感信息 

4 一般等级及问题示例

 1  )
问题类型:变量未初始化
问题示例:
  char  *a; //  变量未初始化 
 char  b[ 100  ];
strcpy(b,a); 

 2  )
问题类型:函数入参未进行校验
问题示例:
  void  FunTest(CTestClass * p)
{
    p ->Get(); //  函数入参未进行校验
} 

 3  )
问题类型:布尔值与非布尔值比较
问题示例:
  int  i =  0  ;
  bool  flag =  true  ;
  if (i == flag) //  布尔值与非布尔值比较 
 {
    ...
} 

 4  )
问题类型:浮点数与0比较
问题示例:
  double  dwLen =  0.1  ;
  if ( 0  == dwLen) //  浮点数与0比较 
 {
    ...
} 

 5  )
问题类型:不同数据类型强制比较或赋值
问题示例:
  long  lMax =  32768  ;
  short  iLen =  0  ;
iLen  = lMax; //  不同数据类型强制赋值 

 6  )
问题类型:复杂表达式未加括号表示优先级
问题示例:
  if (i==j&&i==k||i==l||j==k) //  复杂表达式未加括号表示优先级 
 {
    ...
} 

 7  )
问题类型:函数无返回值或返回值不正确
问题示例:
  bool   Fun()
{
      int  i =  0  ;
    ...
      return  i; //  函数返回值不正确 
}

 8  )
问题类型:指针判断有误
问题示例:
  bool  Fun( char  * p)
{
      if (p) //  指针判断有误 
}

 9  )
问题类型:变量比较应放在 == 左边
问题示例:
  if (p == NULL) //  变量比较应放在==左边 

 10  )
问题类型:重复代码
问题示例:
重复代码要提炼或封装,一定要重复的应加注释其重复合理性 

5 提示等级及问题示例

 1  )
问题类型:魔鬼数字
问题示例:
  for ( int  i= 0 ;i< 1000 ;i++) //  魔鬼数字 
 {
    ...
} 

 2  )
问题类型:注释错误
问题示例:
注释有错别字或语意表达错误 

 3  )
问题类型:注释无效
问题示例:
注释必须要合理,不多余,不废话 

  4 )
问题类型:无注释或注释量过低
问题示例:
注释正常应该在30 %以上

 5  )
问题类型:排版或缩进混乱
问题示例:
空行、缩进必须规范(4空格代替tab) 

 6  )
问题类型:冗余代码
问题示例:
无用注释或无用代码 

 7  )
问题类型:维护性质代码无说明
问题示例:
维护性质的代码要有注释 

 8  )
问题类型:  if 、 for 、 while  、switch等语句应加{}
问题示例:
  switch  (i)   
  case   1  :    
    ...      //  应加{} 
     break  ;   
  case   2  :   
    ...   
      break ;

 9  )
问题类型:文件总行数不超过2000
  10  )
问题类型:函数总行数不超过200
  11  )
问题类型:函数形参不超过5
  12  )
问题类型:命名不符合编程规范 

版权声明:  本博客地址  http://www.cnblogs.com/joinclear ,欢迎转载,转载请标明原文作者和链接。

文章说明:  一家之辞难免有误,欢迎您中肯的指正;如对您有帮助,不胜荣幸,但更希望能够抛砖引玉。

- joinclear     

 

分类:  C/C++

作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于C++代码评审(Code Review)等级标准的详细内容...

  阅读:44次