今天有朋友给我发微信,说他们的供应商遇到一个问题,问题比较棘手,供应商的老板在群里让他们原厂开发帮忙一起分析,然后领导就派他就到现场去。
去的时候看了他们的代码,瞬间觉得有点不可思议,因为厂商竟然用这样的代码生产了几十万台设备。
┄┅┄┅┄┅┄┅┄┅┄┅┄┅┄┅
我把代码简化了下发出来
下午的时候,我同事过来找我,我把这代码发给我同事看了下,我同事觉得这不是致命的问题,大不了打印出来的地址是异常乱码。
踩内存的严重在于踩,也就是你侵犯了一个不应该属于你的领土,这时候就会发生问题,并且很多时候会致命不可恢复的,但是如果你只是读一个不属于你的内存信息,那不会有问题。
返回栈内存是一种未定义行为,如果返回栈内存后马上使用,这个时候栈内存还没有被覆盖,是有可能拿到正确的值的,特别是在嵌入式设备中,很多嵌入式设备跑的是裸机代码,这种程序跑起来要多正常就多正常。
下面是一小段测试代码
如果代码中没有用addr 接收数组地址,执行结果会不一样
但是如果在多任务系统中,栈可能很快被系统回收,这个时候是会出现问题的。
┄┅┄┅┄┅┄┅┄┅┄┅┄┅┄┅
让我匪夷所思的是,这样的代码缝缝补补运行在几十万台设备上。
发现了一个bug,可能还不敢直接正面解决掉,有可能他本来运行是正常的,你加了很多代码,把栈结构改变了,反而出现了各种问题。