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

来源:互联网 发布:python正态分布随机数 编辑:程序博客网 时间:2024/04/28 20:28

感谢博主           http://blog.csdn.net/joinclear/article/details/8786055

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)问题类型:代码圈复杂度不能高于1419)问题类型:函数代码嵌套级数不能超过620)问题类型:调试或日志信息中不能有敏感信息
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)问题类型:文件总行数不超过200010)问题类型:函数总行数不超过20011)问题类型:函数形参不超过512)问题类型:命名不符合编程规范

 

 

原创粉丝点击