项目场景:
BK3266双模BLE开发。
问题描述:
在3266的开发中,使用sprintf进行蓝牙广播地址动态设置的时候,遇到了溢出的问题
sprintf((char*)&EQ_CONFIG_adv_data[sizeof(EQ_CONFIG_adv_data)-4], "%02X%02X",LEconfig_device_address[2],LEconfig_device_address[1]);
原因分析:
最开始的现象,是LEconfig_device_address[0]的初始值不管设置的是多少,最后都变为了00.通过跟原始的SDK代码逐一对比,才跟踪到了这里的问题。sprintf按道理是不会出现这样的溢出问题,应该是库文件重写了。
解决方案:
新建一个临时数组,先把转换的数据存到临时数组,再拷贝到目标数组。
调试经验
查看了整个代码,没有代码对LEconfig_device_address进行修改。所以初步推测是其他地方溢出覆盖到了这里。可以先用dump工具生成map文件,定位LEconfig_device_address存储的位置,然后看一下相临的变量,再去推测问题产生的可能性。这样疑点范围就能大大的缩小,较快问题排查速度。
BK3266的map文件格式大概如下:
004018fc G EQ_CONFIG_adv_data
第一个数字是地址。第二个标记,这里猜测是指全局变量。第三个,是变量名。
这个文件里面还有很多其他标记,目前能猜测到的,g应该表示的是临时变量,T是代码段。剩下的标记,暂时还不是很明确,以后用到了再去研究。