realloc()在嵌入式系统中是否安全?

Jee*_*tel 9 c embedded memory-management realloc

在为嵌入式系统开发软件时,我realloc()多次使用了函数.现在我被告知我"不应该realloc()在嵌入式中使用"而没有任何解释.

realloc()嵌入式系统是危险的,为什么?

Lun*_*din 20

是的,所有动态内存分配都被认为是危险的,并且它被禁止用于大多数"高完整性"嵌入式系统,例如工业/汽车/航空/医疗技术等等.您的问题的答案取决于什么样的嵌入式系统你在干嘛

它被高度完整性嵌入式系统禁止的原因不仅是潜在的内存泄漏,而且还有许多与这些函数相关的危险的未定义/未指定/ impl.defined行为.

编辑:我也忘了提到堆碎片,这是另一个危险.此外,MISRA-C还提到"数据不一致,内存耗尽,非确定性行为"作为不应该使用它的原因.前两者似乎相当主观,但非确定性行为绝对是这类系统所不允许的.

参考文献:

  • MISRA-C:2004规则20.4"不得使用动态堆内存分配."
  • IEC 61508功能安全,61508-3附录B(规范性附录)表B1,> SIL1:"无动态物体","无动态变量".

  • @DipSwitch:现在我们拥有64兆兆甚至半千兆字节RAM的"嵌入式系统","永不"不再适用. (5认同)
  • 这是唯一的好答案.永远不要在嵌入式系统中使用堆内存.将所有数据放在数据部分,bss或堆栈中.这样,您可以获得固定大小的内存占用,并且可以计算内存使用量.这样您就可以确定实际使用了多少内存,并且永远不会超过该限制.使用堆是最常见的向量,使嵌入式系统在运行较长时间后崩溃. (4认同)
  • 我理解这个问题与realloc()有关,特别是与使用动态内存分配无关. (4认同)
  • @Frederico如果你在启动时再调用malloc,那么为什么不首先静态分配内存呢? (3认同)
  • @pmod问题是realloc()是否危险.答案是,是的,就像任何形式的动态内存分配一样. (2认同)

Die*_*Epp 5

这取决于特定的嵌入式系统.一个小型的嵌入式系统的动态内存管理是棘手的开始,但realloc只不过是一个更加复杂freemalloc(当然,这不是它做什么).在某些嵌入式系统上,您从未梦想malloc过首先打电话.在其他嵌入式系统上,你几乎假装它是一个桌面.

如果您的嵌入式系统配置不佳或内存realloc不足,则可能会导致碎片问题.这也是你避免的malloc原因,因为它会导致同样的问题.

另一个原因是某些嵌入式系统必须具有高可靠性,并且malloc/ realloc可以返回NULL.在这些情况下,所有内存都是静态分配的.