【发布时间】:2018-04-13 08:54:48
【问题描述】:
我从事基于嵌入式系统固件代码的工作,目前使用动态内存分配。现在,出于可靠性原因,应删除所有动态内存分配。
作为第一步,我删除了 _sbrk 系统调用实现,这样所有动态分配都无法链接。由于我使用 -ffunction-sections -fdata-sections 进行编译并使用 -Wl,--gc-sections 进行链接,因此只要不发生动态内存分配,我希望链接步骤能够完成。 (这在过去的 C 项目中对我有用,在这里不确定 C++。)
尽管预期会出现以下链接器错误消息,但它无助于查找触发动态分配的 C++ 构造。
[...]arm-none-eabi/lib/thumb/v7e-m/fpv4-sp/hard/libc.a(lib_a-sbrkr.o): In function `_sbrk_r':
sbrkr.c:(.text._sbrk_r+0xc): undefined reference to `_sbrk'
collect2: error: ld returned 1 exit status
有没有一种有效的方法可以找到使用动态堆分配的 C++ 语言结构(除了明显使用 new)?
编辑:我正在寻找静态工具,而不是运行时检测/分析技术。
EDIT2:(因为有人删除了相应的标签:)该项目以 STM32F4 MCU 为目标,并使用基于 GCC 的 arm-none-eabi-* 工具链进行编译和链接。
【问题讨论】:
-
@Ron 正确,这些是棘手的部分。我正在寻找一种方法来获取错误消息或警告,这些错误消息或警告指向我的代码基础中此类构造的具体出现。例如在编译期间或通过静态分析等。
-
为什么在嵌入式系统上有一个 sbrk 系统调用?这表明你有一些类似 Linux、类似 PC 的东西。
-
@Lundin 目标是STM32F4,_sbrk只是newlib分配内存的方式。在这种情况下,您还能期待什么?
-
我原以为图书馆会自行处理分配。但相反,它显然做了一些臭名昭著的“系统”调用。至于触发_sbrk调用的函数,它似乎是_sbrk_r,所以可能你没有以干净的方式杀死这个库。调用它的 _sbrk 可能在同一个翻译单元中存在函数,即使应用程序不使用这些函数。
-
@Lundin :在 newlib 中,
_sbrk是用户提供的系统调用,以便能够使其适应各种托管和非托管环境。 sbrk 不做实际的分配或堆管理,它只是向堆管理器提供数据。 sourceware.org/newlib/libc.html#Syscalls 定义了独立系统的最小实现