您可以捐助,支持我们的公益事业。

1元 10元 50元





认证码:  验证码,看不清楚?请点击刷新验证码 必填



  求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Modeler   Code  
会员   
 
   
 
 
     
   
 订阅
  捐助
C++代码评审(Code Review)等级标准
 
作者:joinclear的博客 来源:博客园 发布于 2015-04-17
   次浏览      
 

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) 问题类型:命名不符合编程规范
   
次浏览       
相关文章

深度解析:清理烂代码
如何编写出拥抱变化的代码
重构-使代码更简洁优美
团队项目开发"编码规范"系列文章
相关文档

重构-改善既有代码的设计
软件重构v2
代码整洁之道
高质量编程规范
相关课程

基于HTML5客户端、Web端的应用开发
HTML 5+CSS 开发
嵌入式C高质量编程
C++高级编程
最新活动计划
LLM大模型应用与项目构建 12-26[特惠]
QT应用开发 11-21[线上]
C++高级编程 11-27[北京]
业务建模&领域驱动设计 11-15[北京]
用户研究与用户建模 11-21[北京]
SysML和EA进行系统设计建模 11-28[北京]

WEB应用程序UI模版代码编写
C# 编码规范和编程好习惯
什么是防御性编程
善于防守-健壮代码的防御性
Visual C++编程命名规则
JavaScript程序编码规范
更多...   


设计模式原理与应用
从需求过渡到设计
软件设计原理与实践
如何编写高质量代码
单元测试、重构及持续集成
软件开发过程指南


某全球知名通信公司 代码整洁
横河电机 如何编写高质量代码
某知名金融软件服务商 代码评审
东软集团 代码重构
某金融软件服务商 技术文档
中达电通 设计模式原理与实践
法国电信 技术文档编写与管理
更多...