公司一款手持终端,是在老产品代码的基础上研发,经常发生死机问题,死机原因很大部分是代码不严谨导致,今天排查遇到一个整型溢出导致的死机问题:
在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; ...... }
这里存在两个问题导致死机:
- rec_sds_length未初始化;
- g_sds_length与rec_sds_length定义类型不一致;
- 取值范围在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; //此处编译器将报错 ...... }
总结:好的习惯可以预防问题,坏的习惯将产生问题。
时间: 2024-10-10 07:51:34