变量命名不规范引起的bug

笔记

在同事的固件工程上, 改一个版本出来, 进行中.
按照以前同事的思路, 添加了一个新的设备处理的回调.
添加完, 美滋滋的试试, 突然发现UDP线程和socket命令处理线程根本就没 进入.

但是可以ping通这个设备, 而且MDK固件工程还在跑.
在等锁? 内存分配失败?

还好, 我知道我在加这个设备处理实现前,是好使的, 用我自己做的上位机程序, 是可以和设备通讯的.

所以如果自己改了程序, 要尽早测试, 如果发现和自己改的代码不相关的问题, 也要查清除, 先回到自己改之前, 看看是不是自己改代码引起的.
如果不查清楚, 越到后来,问题越多, 多到撸不清楚问题的源头.

那我这个新加的设备驱动哪里有问题呢?
通过注释法, 试验发现, 只要不执行这个设备的初始化函数, 就一切正常.
在到设备初始化函数中, 从后向前屏蔽, 直到可以正常运行.
发现出在 memset处(). 出现了向未知地址赋值的情况, 但是程序没崩溃,还在跑…

出错的代码如下:

memset(&Data_Cache, 0, sizeof(Data_Struct) * UartDeviceInfo.amount);

我新建的这个设备驱动, 是从同事已有的设备驱动上拷贝过来的.
去看 Data_Cache 的定义

static Data_Struct*			Data_Cache;

Data_Cache 这个东东是一个指针.
代码改成如下就好了.

memset(Data_Cache, 0, sizeof(Data_Struct) * UartDeviceInfo.amount);

吐槽

代码改吧改吧, 没有问题时, 觉得同事的代码还是写的挺NB的.
一出问题,一分析,就一定要赖人了.

这种代码不规范, 引起的问题排查起来不难, 但是很浪费时间.
特别是固件工程, 不想上位机程序那样(调试起来很方便). 实验一次, 咋也得一分钟. 这个问题看起来简单, 但是排查用了6个小时.

各种怀疑, 各种试验.

其中最让我心慌的是, 别是内存不够用了, 因为我优化了逻辑, 加了几个数据结构的队列. 最后, 在内存分配失败那里加了通知函数, 不是内存不够引起的, 我心就踏实了:)

关键是出错那句memset并没有引起崩溃. 还正常跑者呢. 这事弄的.

假设这个指针Data_Cache 是p打头的, 我就知道, 这玩应是个指针, 不会在指针前再加地址符号.

编码要规范, 这不是一句空话. 编码规范会省时省力.

鄙人水平也很挫, 不见得重构的有多好, 但是至少不会因为变量命名不规范, 引起变量误用.

最后代码重构成下面这样.

// 设备配置数据和实时数据缓存
#pragma pack(push, 1)
typedef struct _TAG_DEVICE_DATA{
	char device_name[26]; // 最多12个汉字 + \0, 26个字节够用了
	// ...
	bool action_enable; // 告警策略是否使能
} TAG_DEVICE_DATA; 
#pragma pack(pop)
// 至少能知道, 这是一个指针类型的静态变量
static TAG_DEVICE_DATA*			spAry_DeviceDataCache;			//数据缓存区指针,动态分配内存,将地址放入此指针
// 根据设备数量申请设备数据缓存
		spAry_DeviceDataCache 		 = (TAG_DEVICE_DATA*)ram_malloc_in(sizeof(TAG_DEVICE_DATA) *
		                                        UartDeviceInfo.amount);	
		memset(spAry_DeviceDataCache, 0, sizeof(TAG_DEVICE_DATA) * UartDeviceInfo.amount);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值