我最近在为自定义串行通信协议编写代码。我使用接收数据的一部分(8/16位)来表示帧大小。根据这个数据,我期望有一定数量的数据跟随。我使用Crc来接受或拒绝一个帧。但是,在处理一个帧之前,我无法将帧长度数据包含在Crc中,因为在接收端,我应该知道要期望多少数据。
我遇到的问题是,偶尔这个帧长度数据会损坏,并欺骗接收器接收那么多字节,而接收数组大小远小于那个数值。这会破坏许多关键系统变量,这些变量存在于连续的内存位置中。
如何防止缓冲区溢出?我的想法是: 1)如果超过某个值,则拒绝帧长度数据。 2)使用限制最大数量的数据类型。例如,使用short将数组索引范围限制在256个内存位置内,并创建一个具有280个字节的缓冲区。 3)在单独的位置分配内存,这样就不会影响关键系统变量。
为了防止陷入接收循环中,我使用超时来预防。但是我忽略了这个问题的方面。由于这段代码是大型系统代码的一部分,而我不是专家,所以花了很长时间来确认和重现这个问题。
通常如何安全地处理这种问题? 此外:在使用数组时,有哪些一般考虑因素或标准实践可以防止溢出?
我遇到的问题是,偶尔这个帧长度数据会损坏,并欺骗接收器接收那么多字节,而接收数组大小远小于那个数值。这会破坏许多关键系统变量,这些变量存在于连续的内存位置中。
如何防止缓冲区溢出?我的想法是: 1)如果超过某个值,则拒绝帧长度数据。 2)使用限制最大数量的数据类型。例如,使用short将数组索引范围限制在256个内存位置内,并创建一个具有280个字节的缓冲区。 3)在单独的位置分配内存,这样就不会影响关键系统变量。
为了防止陷入接收循环中,我使用超时来预防。但是我忽略了这个问题的方面。由于这段代码是大型系统代码的一部分,而我不是专家,所以花了很长时间来确认和重现这个问题。
通常如何安全地处理这种问题? 此外:在使用数组时,有哪些一般考虑因素或标准实践可以防止溢出?