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)
问题类型:ifforwhile、switch等语句应加{}
问题示例:
switch(i)   
case 1:    
    ...    //应加{}
    break;   
case 2:   
    ...   
    break;
9)
问题类型:文件总行数不超过2000
10)
问题类型:函数总行数不超过200
11)
问题类型:函数形参不超过5
12)
问题类型:命名不符合编程规范
posted on 2013-04-11 00:52  joinclear  阅读(3292)  评论(4编辑  收藏  举报