zoukankan      html  css  js  c++  java
  • 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)
    问题类型:命名不符合编程规范

    版权声明: 本博客地址 http://www.cnblogs.com/joinclear,欢迎转载,转载请标明原文作者和链接。

    文章说明: 一家之辞难免有误,欢迎您中肯的指正;如对您有帮助,不胜荣幸,但更希望能够抛砖引玉。

    - joinclear     

  • 相关阅读:
    Spring AOP概念理解
    五分钟快速掌握RPC原理及实现
    Linux常用命令汇总
    一致性哈希算法原理
    RPC原理及实现
    IO设计模式:Reactor和Proactor对比
    到底什么时候该使用MQ?
    eclipse查看一个方法被谁引用(调用)的快捷键四种方式
    maven build pulgin
    VSCode 常用setiings.json设置
  • 原文地址:https://www.cnblogs.com/joinclear/p/3011515.html
Copyright © 2011-2022 走看看