最近做的一个项目,遇到一个bug,感觉挺有意思的,心血来潮记录一下typedef struct { char filename[32]; uint8_t ver[3]; bool valid; } swversion_t;//定义一个结构体数组swversion_t swversion[6] = { 0 };
当我用snprintf将JSON文件读取到的filename都写入结构体数组的成员后又调用sscanf将读取到的版本号写入ver[3]中,这时候问题就来了sscanf (m1_Verion->valuestring, "%d.%d.%d", &swversion[0].ver[0], &swversion[1].ver[1],&swversion.ver[2]);
| | | |
| | | ver[0], ver[1], ver[2], valid |
| | | ver[1], ver[2], valid, 以及后面3字节 |
| | | |
所以从而导致swversions[1]开始的filename都被篡改如果是单片机开发,这类错误很容易被定位出来,watch窗口查看变量即可但是在Linux平台中,产品功能太多,基本只能通过打印Log的方式查看(gdb调试用的不熟练)而且每次编译都要十几分钟也是很骚的