公司一款手持终端,是在老产品代码的基础上研发,经常发生死机问题,死机原因很大部分是代码不严谨导致,今天排查遇到一个整型溢出导致的死机问题:


  在foo.c文件中定义有 char g_sds_length = 0;

  在foo.h文件中声明为 extern char g_sds_length;


  但是在bar.c中有定义有   

    void api_sds_rec_handle()
    {
        int rec_sds_length;
        g_sds_length = rec_sds_length;
        
        ......
    }


这里存在两个问题导致死机:

  1. rec_sds_length未初始化;

  2. g_sds_length与rec_sds_length定义类型不一致;

  3. 取值范围在0-255的g_sds_length被Int型随机值初始化,导致死机。


如何避免类似的问题产生?

可以通过更严格的类型检查来预防此类问题,如:

typedef struct { char length} sds_length_t;
sds_length_t g_sds_length = {0};

不直接定义为char型是为了更严格的类型检查,而且是编译器在编译过程中自动检查:

void api_sds_rec_handle()
{
    int rec_sds_length;
    g_sds_length = rec_sds_length; //此处编译器将报错
    
    ......
}

总结:好的习惯可以预防问题,坏的习惯将产生问题。