zoukankan      html  css  js  c++  java
  • 最近的bug列表总结(C++)

    最近写了一大段代码,抽象得厉害,容易绕进去,因为写单测的代价很大(借口),所以很多问题到联调的是否才发现。

    而且花费了很大的经历才查出来,主要问题有如下几个问题

    1. 变量未初始化

    具体来说,就是指针之类的,这个是之前遇到的比较多,当前已经很少了,拿出来说是因为这次用上了一个栈上单例(常见的单例,一般是new一个对象)的实现。

    因为对其用法理解不深,导致为初始化对象。

    2. 绑定端口失败

    绑定端口失败后,主线程退出了,然后在启动的线程就core掉了。从core文件分析以为是线程有什么问题,但后来不断地删除代码,最终定位是port绑定失败,换一个端口就好了。

    如果早点去看日志,就不必绕这么大的弯了!!

    3. 自动完成

    写代码时,用到了vim的自动完成功能,导致函数一直返回-1, 示例代码如下

    int Class::init(int output, int input)
    {
        // arg check
        if (output_)
        {
             return -1;
        }
        .....
    }
    

     这种情况下,编译器完全没有错误提示,只能靠自己小心了。。

    4.继承类调用基类同名函数

    基本的实例代码如下

    class Base {
    public:
       int init(int output, int input);
    };
    class Class : public Base {
    int init(int output, int input);
    };
    
    int Class::init(int output, int input)
    {
        // arg check
        if (output_)
        {
             return -1;
        }
         
        // return Base::init(output, input)
        return init(output, intput);
    }
    

    继承类同名参数列表调用基类参数列表,本来只是想调用基类的init函数,但由于override了,所以还是会继续调用Class::init(),最终会因为递归栈深度core掉。

    此时需要显示的指定调用的为基类函数.

     5. protobuf 通信问题

    protobuf

    写的程序是server-client模式,cs间通信协议是用protobuf定义的。client 将protobuf封装好,通过tcp发送给server后,server端报解析失败。

    这个错误以前也遇到过,问题的根源是,项目中protobuf并不是以同一个模块存在的,而是client和server中均有一个独立的模块。双方需要对协议。

    后来查找出的问题是server端protobuf 添加了一个required字段,没有通知client端,导致解析错误

    同样这个问题,如果早点看日志的话,调试时间会少很多。因为我们一般在专门的log中查找,并没有去标准输入和输出的日志中去查找错误。而protobuf

    解析错误具体的日志信息是放在了标准输入输出中。

     6. 分号问题

    其实是一个很傻的问题,在将语句改写为if条件时引入的,具体代码如下

    get_return_int(zzz);
    ->
    if (get_return_int(zzz)<0);
    {
        printf("negtive something
    ");
        return -1;
    }
    return 0

    在if后多了个;导致总是返回-1

    7. 溢出

    相关代码如下。

    int64_t get_file_size(const char* filename)
    
    int file_size = get_file_size("data/westfly")
    if (file_size < 0)
    {
       printf ("load errro
    ");
       return -1;
    }
    return 0;

    加载一份文件,之前小于2G,用int可以保存大小。某一天大于2g了,int就小于0了,导致说加载出错。

    8. opt版本core,debug版本不core

    现象debug版本中,运行得很好,打开-O2选项,进行opt发布版,运行就core掉了。

    根据core文件, info thread

    发现线程只有50多个,正常预期应该是150左右。明显某些线程没启动起来。

    于是怀疑是主线程粗暴的退出了,导致其它线程访问出错。

    添加相关日志,确认了失败的具体位置,经过定位,发现是某个基类函数最后

    没有返回值。但外层经过了判断,导致主线程退出了。

    9. 单线程不core,多线程core

    拷贝之前的代码,没有多想,之前的代码中是支持多线程的,但线上居然只配置了一个(坑啊!!)

    然后,我这个需求需要其多个来处理,导致core掉。

    找了很久,一个个线程的看状态,发现某个资源的mutex被其它线程持有(core文件找问题也需要看机缘啊),

    于是分析得到可能是共享变量的问题。

    最终定位到从某个全局的资源池获取资源的时候,没有加锁。添加锁后完美解决。

    10. protobuf 返回值误用

    static bool ParseFromString(const string & input, Message * output);

    if(ParseFromString() < 0)

    {

    }

    默认为返回值为int类型,导致出错返回false时,也显示成功。

    11. 状态机问题

    12. 默认参数

    程序中用到一个hashmap,插入时value的接口为

    insert(key, value, flag=0)

    关键是最后一个默认参数,表示当key存在时的处理,

    当flag = 0 时,如果key存在,则忽略

    当flag=1时,如果key存在,则覆盖。

    在程序调用时,直接insert了,采取默认参数0.

    而程序reload接口与load 共同调用一个函数。

    导致reload时,新value不生效。

    13. shell转码问题

    为了加密系统,使用了base64编解码,用的是私有的码表,生成了url,通过curl 请求时反解url时,总是缺一些信息,

    几次定位才发现url中包含$符号,shell在curl时,将$后的字符转义为变量了,导致为空,将双引号改成单引号就好了。

    14. 程序边界问题

    某天,接到报警,线上的server down掉了,经过定位,发现是返回值未加判断的问题。

    其实,还是接上面一个场景,我以为经过base64加密后,应该就高枕无忧了,在base64反解码的时候,就没有判断是否解码成功,结果

    对于某些请求base64反解码的返回值为负值,导致往string中assign时,core掉了。

    应该是我们编的url太过显眼,然后被人想方法破解,结果程序就core掉了。还是考虑不周全啊。

  • 相关阅读:
    CodeForces 492C Vanya and Exams (贪心)
    CodeForces 492A Vanya and Cubes
    如何设置 Windows 默认命令行窗口大小和缓冲区大小
    [MySQL] Data too long for column 'title' at row 1
    [转] Hibernate不能自动建表解决办法(hibernate.hbm2ddl.auto) (tables doesn't exist)
    CodeForces 489D Unbearable Controversy of Being (不知咋分类 思维题吧)
    Autofac官方文档翻译--二、解析服务--1解析参数传递
    Autofac官方文档翻译--一、注册组件--4组件扫描
    Autofac官方文档翻译--一、注册组件--3属性和方法注入
    Autofac官方文档翻译--一、注册组件--2传递注册参数
  • 原文地址:https://www.cnblogs.com/westfly/p/4115105.html
Copyright © 2011-2022 走看看