gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 15:37:51 27 4
gpt4 key购买 nike

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

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

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

我用来防止卡在接收循环中的一件事是使用超时。但是我忽略了这方面的问题。如果有时间确认和重现问题,我觉得很长,因为代码是更大系统代码的一部分,我不是这里的专家。

一般如何安全处理这类问题?

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

最佳答案

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

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

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

老实说,最好的方法是重新考虑您的自定义串行通信协议(protocol)。听起来它并不能很好地解决您遇到的错误。您可以在消息的开头和结尾使用同步字节,以确保您实际上收到了良好的数据,并且可以毫无问题地对整个消息进行 CRC 校验,并定义将通过线路的最大数据包大小并指示有多少数据包要发送到被接收。如果通信协议(protocol)不是很好,那么您必须从下到上重新考虑它。

关于c - 如何防止缓冲区溢出/数组溢出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36521122/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com