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)等级标准的详细内容...