我最近正在为自定义串行通信协议编写代码。我所做的是,我使用了接收数据的一部分(8/16 位)来表示帧大小有多大。基于这些数据,我预计没有数据可以遵循。我使用 Crc 来接受或拒绝一个框架。但是我不能在 Crc 中包含帧长度数据,因为在接收端我应该知道在处理帧之前需要多少数据。
我面临的问题是,有时这个帧长度数据会被破坏,它会欺骗接收器接收那么多字节,而接收数组的大小要小得多。这会破坏连续内存位置中存在的许多关键系统变量。
如何防止发生缓冲区溢出?我对此的想法 1)如果帧长度数据超过某个值,则拒绝它。2)使用限制最大数量的数据类型。就像使用 short 将数组索引的范围限制为 256 个内存位置,并创建一个 280 字节的缓冲区。3)在单独的位置分配内存,这样它就不会影响关键的系统变量。
我用来防止卡在接收循环中的一件事是使用超时。但我忽略了这个问题。如果有时间确认和重现该问题,我会觉得很多,因为代码是更大系统代码的一部分,我不是这里的专家。
一般如何安全地处理这类问题?
另外:使用数组时要遵循的一般注意事项或标准做法是什么,以防止它溢出?