The behavior of the assert macro depends on the conditions in operation at the most recent occurrence of #include <assert.h>:
If the NDEBUG macro is defined (on the command line or as part of a source file), the assert macro has no effect.
If the NDEBUG macro is not defined, the assert expression (the expression given to the assert macro) is evaluated. If the result is TRUE, that is != 0, the assert macro has no further effect.
If the assert expression evaluates to FALSE, the assert macro calls the __aeabi_assert() function if any of the following are true:
you are compiling with ‑‑strict
you are using ‑O0 or ‑O1
you are compiling with ‑‑library_interface=aeabi_clib or ‑‑library_interface=aeabi_glibc
__ASSERT_MSG is defined
_AEABI_PORTABILITY_LEVEL is defined and not 0.
Otherwise, if the assert expression evaluates to FALSE and the conditions specified in point 3 above do not apply, the assert macro calls abort(). Then:
abort() calls __rt_raise().
If __rt_raise() returns, abort() tries to finalize the library.
If you are creating an application that does not use the library, __aeabi_assert() works if you re‑implement abort() and the stdio functions.
Another solution for retargeting is to re‑implement the __aeabi_assert() function itself. The function prototype is:
void __aeabi_assert(const char *expr, const char *file, int line);
where:
The behavior for __aeabi_assert() supplied in the ARM C library to print a message on stderr and call abort().
You can restore the default behavior for __aeabi_assert() at higher optimization levels by defining __ASSERT_MSG.