c-如何防止缓冲区溢出/数组溢出



我最近正在为自定义串行通信协议编写代码。我所做的是,我使用接收数据的一部分(8/16位)来表示帧大小有多大。基于这些数据,我预计接下来没有数据。我使用Crc来接受或拒绝框架。但我无法将帧长度数据包含在Crc中,因为在接收端,在处理帧之前,我应该知道需要多少数据。

我面临的问题是,偶尔帧长度的数据会被破坏,它会欺骗接收器接收那么多字节,而接收数组的大小远小于此。这会破坏连续内存位置中存在的许多关键系统变量。

如何防止缓冲区溢出?我对此的看法1) 如果帧长度数据超过某个值,则拒绝该数据。2) 使用限制最大编号的数据类型。类似于使用将数组索引的范围限制为256个内存位置的short,并创建一个280字节的缓冲区。3) 将内存分配到一个单独的位置,这样就不会影响关键的系统变量。

我用来防止在接收循环中陷入困境的一件事是使用超时。但我忽略了这个问题的这一方面。如果需要时间来确认和重现这个问题,我会花很多时间,因为代码是更大系统代码的一部分,而我不是这里的专家。

一般来说,如何安全地处理这类问题?

此外:在使用数组时,为了防止数组溢出,应遵循哪些一般注意事项或标准做法?

有很多东西可以用来最大限度地减少这个问题,但一般来说,没有一个一刀切的解决方案。你必须做出决定,了解如果出现问题会发生什么,并让你的系统能够处理它

你必须弄清楚什么最适合你的系统。例如,如果您从未期望消息大于256,那么将缓冲区的大小声明为0xFF,将缓冲区索引声明为uint8_t,则您将永远无法超过它,每次插入一个字节,因为索引永远不会达到256并溢出回0。当然,这样做的缺点是,如果确实发生了这种情况,您会覆盖接收到的一些数据,但在大多数情况下,crc检查应该会显示错误。

您可以做的另一件事是将数据长度与缓冲区最大值进行比较,如果超过缓冲区,则不存储消息。因此,你会直接拒绝任何数据长度过大且已接收的消息,但不会存储遇到的数据。显然,如果数据长度经常被破坏,你会遇到很多问题。

老实说,最好的方法是重新考虑您的自定义串行通信协议。这听起来并不能很好地解决你遇到的错误。您可以在消息的开头和结尾设置同步字节,以确保您确实收到了良好的数据,并对整个消息进行CRC校验,这没有问题,还可以定义最大数据包大小,这些数据包大小将穿过导线并发出要接收多少数据包的信号。如果通信协议不是很好,那么你必须自下而上地重新思考。

首先,检查成帧错误,检查奇偶校验错误

其次,检查数据大小的大小。如果太大或太小,则拒绝整个数据块

最新更新