У меня есть приложение, которое работает на MCU на базе ARM Cortex-M и написано на языках C и C++. Я использую gcc
и g++
, чтобы скомпилировать его и хотел бы полностью отключить любое использование кучи.GCC: Как отключить использование кучи полностью на MCU?
В стартовом файле MCU размер кучи уже установлен равным 0. В дополнение к этому, я также хотел бы запретить любое случайное использование кучи в коде.
Другими словами, я хотел бы линкер (и/или компилятор), чтобы дать мне ошибку, когда malloc
, calloc
, free
функции или new
, new[]
, delete
, используются delete[]
операторы.
До сих пор я пробовал -nostdlib
, который дает мне такие вопросы, как undefined reference to _start
. Я также пробовал -nodefaultlibs
, но я все еще не жалуюсь, когда пытаюсь позвонить malloc
. Каков правильный способ сделать это?
Примечания:
- Это приложение работает на «голый металл», нет никакой операционной системы.
- Я также хотел бы избежать использования malloc в стороннем коде (специализированные библиотеки, стандартная библиотека, printf и т. Д.).
- Я полностью в порядке, не используя части стандартных библиотек C/C++, для которых требуются динамические выделения памяти.
- Я бы предпочел время компиляции, а не время выполнения.
Вы всегда можете удалить кучу из памяти через скрипт линкера, но это не помешает таНос звонки. Единственный безопасный способ сделать код idiot-proof, вероятно, использовать статический анализатор, как, например, некоторые проверки MISRA. Но серьезно, почему у вас есть какой-либо код с использованием динамической памяти в вашем проекте? Как минимум, обзор кода легко обнаружит это. – Lundin
Не видя целиком ваше приложение, получение окончательного ответа может быть невозможным. Даже простые функции C, такие как 'printf()' будут использовать 'malloc()'/'free()' внутренне. И с участием C++ вы, вероятно, не можете использовать * anything *, который полагается на библиотеку времени выполнения C++. Просто загрузка библиотеки времени выполнения C++, вероятно, широко использует кучу. Я бы рискнул сказать, что это должно быть требование приложения с самого начала дизайна, чтобы быть успешным. –
Если у вас есть заголовок, видимый для всей программы, вы можете сделать какой-то взломать как # #define malloc (dummy) NULL; _Static_assert (0, «Err: использование динамической памяти») '. Не очень, но полностью портативен. – Lundin