POSIX.1-2008 compliant version of the assert macro. More...
POSIX.1-2008 compliant version of the assert macro.
Definition in file assert.h.
#include <stdint.h>
Go to the source code of this file.
#define | DEBUG_ASSERT_VERBOSE |
Activate verbose output for assert() when defined. | |
#define | DEBUG_ASSERT_BREAKPOINT |
Activate breakpoints for assert() when defined. | |
#define | __NORETURN |
hidden (__) NORETURN definition | |
#define | assert(cond) (_likely(cond) ? (void)0 : _assert_failure(__FILE__, __LINE__)) |
abort the program if assertion is false | |
#define | static_assert(cond, ...) { enum { static_assert_failed_on_div_by_0 = 1 / (!!(cond)) }; } |
static_assert for c-version < c11 | |
#define | DEBUG_ASSERT_NO_PANIC (1) |
Don't panic on a failed assertion, just halt the running thread. | |
__NORETURN void | _assert_failure (const char *file, unsigned line) |
Function to handle failed assertion. | |
#define assert | ( | cond | ) | (_likely(cond) ? (void)0 : _assert_failure(__FILE__, __LINE__)) |
abort the program if assertion is false
If the macro NDEBUG was defined at the moment <assert.h> was last included, the macro assert() generates no code, and hence does nothing at all.
Otherwise, the macro assert() prints an error message to standard error and terminates the application by calling core_panic().
The purpose of this macro is to help programmers find bugs in their programs.
A failed assertion generates output similar to:
0x89abcdef => FAILED ASSERTION.
Where 0x89abcdef is an address. This address can be used with tools like addr2line
(or e.g. arm-none-eabi-addr2line
for ARM-based code), objdump
, or gdb
(with the command info line *(0x89abcdef)
) to identify the line the assertion failed in.
With DEBUG_ASSERT_VERBOSE defined this will instead directly print the file and the line the assertion failed in:
example/file.c:42 => FAILED ASSERTION.
If the backtrace
module is enabled (and implemented for the architecture in use) a backtrace will be printed in addition to the location of the failed assertion.
If DEBUG_ASSERT_BREAKPOINT is defined, the execution will stop on a failed assertion instead of producing the above output. If the architecture defines the macro DEBUG_BREAKPOINT, a breakpoint is inserted and the execution is stopped directly in the debugger. Otherwise the execution stops in an endless while loop.
#define DEBUG_ASSERT_BREAKPOINT |
Activate breakpoints for assert() when defined.
Without this macro defined the assert() macro will just print some information about the failed assertion, see assert() and DEBUG_ASSERT_VERBOSE. If DEBUG_ASSERT_BREAKPOINT is defined, the execution will stop on a failed assertion instead of producing the output. If the architecture defines the macro DEBUG_BREAKPOINT, a breakpoint is inserted and the execution is stopped directly in the debugger. Otherwise the execution stops in an endless while loop.
#define DEBUG_ASSERT_NO_PANIC (1) |
#define DEBUG_ASSERT_VERBOSE |
Activate verbose output for assert() when defined.
Without this macro defined, assert() will just print the address of the code line the assertion failed in. With this macro defined, assert() will also print the file and the code line of the failed assertion.
Enabling verbose output will on the other hand lead to an increased size of the binary, since it needs to contain the names of all files with assertions.
To define just add it to your CFLAGS
in your application's Makefile:
#define static_assert | ( | cond, | |
... | |||
) | { enum { static_assert_failed_on_div_by_0 = 1 / (!!(cond)) }; } |
__NORETURN void _assert_failure | ( | const char * | file, |
unsigned | line | ||
) |
Function to handle failed assertion.
[in] | file | The file name of the file the assertion failed in |
[in] | line | The code line of file the assertion failed in |