malloc ожидает size_t для аргумента. size_t - это typedef для unsigned int или unsigned long (в зависимости от платформы), ключ здесь UNSIGNED.
Вы используете int для file_size, и int может быть ПРОСТО 16 бит (вы используете ARM, поэтому я подумаю, что это MCU). Знаковые 16 бит могут поддерживать только 32 768 байт размера файла в байтах, поэтому, если у вас большой файл (на самом деле не такой большой, просто> 32 КБ), file_size будет переполнен.
Я думаю, что вам это сказал компилятор, но вы решили проигнорировать его ... теперь Мэллов принимает беззнаковый аргумент, поэтому он автоматически приводит вашу подписанную оценку размера файла + 1 (даже если он сильно переполнен, подписанный большой отрицательный знак времени ) и пытается выделить память.
Это может означать, что вы пытались выделить слишком много памяти, чем это встроенное приложение. не мог иметь (не должен был разбиться).
На самом деле я не вижу причины сбоя (кроме плохой библиотеки, которая во встроенном C является распространенной из-за низкой обратной связи с пользователями), но я вижу ошибки, которые приводят к нежелательному поведению.
Я даже не пойду и не спрошу: «Почему все пошло?», Потому что ответ вызвал бы много пламенных комментариев.