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