gpt4 book ai didi

c - 嵌入式系统中的堆溢出检测/预防

转载 作者:太空宇宙 更新时间:2023-11-04 08:05:41 30 4
gpt4 key购买 nike

最近我被嵌入式系统上的堆溢出困扰了好几次。

这通常是由于写入堆上声明的数组超过了数组的大小,这必须超过其他堆声明的变量,然后导致非常未定义的行为 - 使得根本原因难以追踪。

是否有任何方法可以检测/防止嵌入式系统上的此类堆溢出错误?我正在为 STM32 平台开发,但很乐意了解任何通用方法。我很高兴听到在运行时发现溢出的方法或可以在编译前发现溢出的静态分析方法。

请注意,因为这是在嵌入式系统上运行的代码,所以很少使用 malloc - 大多数堆变量都是在不使用 malloc 的情况下静态或全局声明的。

最佳答案

我一直在回答你的问题,直到你说到最后一段,你所谓的“堆”似乎有些困惑。因此,我假设您的大部分问题都发生在访问数组边界之外的内存时,而不管数组的内存实际位于何处。

这是我通常尝试做的事情:

  1. 永远不要使用 malloc。它通常不会在嵌入式微 Controller 代码中完成。这是好事还是坏事是判断问题。意见各不相同,但我只是远离它。最坏情况下的分配可能会浪费一些内存,但通常我发现可以为针对微 Controller 的应用程序找到合理的数组大小界限。
  2. 尝试将特定系统与平台无关。对于访问硬件等尤其如此。不要直接做;使用目前通常由芯片制造商提供的一些硬件层。
  3. 对于与平台无关的部分,您现在可以去除系统特定部分并编译代码以在桌面上运行。在那里您可以访问各种工具来分析正在发生的事情。您可以获得无法在微 Controller 上运行的静态分析器。您还可以进行更好的代码覆盖率分析,更多的测试更容易自动化。您可能会遇到桌面和微 Controller 之间的可移植性问题,但我没有发现这是一个大问题。谨慎、便携的编码是关键。

当然,现在还有更多的工作要做,而且在开始项目时考虑到这些想法肯定会有所帮助。但多年来,我发现在我可以使用更好工具的环境中尝试运行嵌入式代码比尝试改进嵌入式环境本身更容易。

关于c - 嵌入式系统中的堆溢出检测/预防,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43035285/

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