【发布时间】:2016-04-09 18:43:32
【问题描述】:
我最近正在为自定义串行通信协议编写代码。我所做的是,我使用了接收数据的一部分(8/16 位)来表示帧大小有多大。根据这些数据,我预计 没有数据可以遵循。我使用 Crc 来接受或拒绝一个框架。但我无法在 Crc 中包含 帧长度 数据,因为在接收端我应该知道在处理帧之前需要多少数据。
我面临的问题是,有时这个帧长度数据会被破坏,它会欺骗接收器接收那么多字节,而接收数组的大小要小得多。这会破坏连续内存位置中存在的许多关键系统变量。
如何防止缓冲区溢出? 我对此的看法 1) 如果 framelength 数据超过某个值,则拒绝它。 2)使用限制最大数量的数据类型。就像使用 short 将数组索引的范围限制为 256 个内存位置,并创建一个 280 字节的缓冲区。 3) 在单独的位置分配内存,这样就不会影响关键的系统变量。
我用来防止卡在接收循环中的一件事是使用超时。但我忽略了这个问题。 如果有时间确认和重现该问题,我会觉得很多,因为代码是更大系统代码的一部分,我不是这里的专家。
一般如何安全处理此类问题?
另外:使用数组时应遵循哪些一般注意事项或标准做法,以防止其溢出?
【问题讨论】:
-
发送缓冲区长度两次(可能第二次倒置)。如果匹配就OK了。
-
您可以通过选择包含奇偶校验位的串行协议来改进错误检测。
-
这就是简单的解决方案。另一种解决方案是发送一个固定大小的标头,该标头本身具有 CRC 或某种前向纠错功能。
-
我的意思是,即使客户端收到损坏的帧长度,也没有任何理由可以欺骗客户端进入缓冲区溢出。客户端知道它的缓冲区有多大,它可以完全控制它在哪里存储多少字节。
-
在任何情况下都没有 100% 万无一失的错误检测机制。这都是一个开销很大的问题——无论是在数据方面还是在计算方面——您想要投资于错误检测,以及您希望数据以无法检测到的方式损坏的可能性有多大。跨度>
标签: c arrays embedded exception-safety memory-safety