Zephyr Project API 4.4.99
A Scalable Open Source RTOS
Loading...
Searching...
No Matches
__assert.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2011-2014 Wind River Systems, Inc.
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
7#ifndef ZEPHYR_INCLUDE_SYS___ASSERT_H_
8#define ZEPHYR_INCLUDE_SYS___ASSERT_H_
9
10#include <stdbool.h>
11#include <zephyr/toolchain.h>
12
13#ifdef __cplusplus
14extern "C" {
15#endif
16
17/* Wrapper around printk to avoid including printk.h in assert.h */
18void __printf_like(1, 2) assert_print(const char *fmt, ...);
19
20#ifdef __cplusplus
21}
22#endif
23
24#if defined(CONFIG_ASSERT_VERBOSE)
25#define __ASSERT_PRINT(fmt, ...) assert_print(fmt, ##__VA_ARGS__)
26#else /* CONFIG_ASSERT_VERBOSE */
27#define __ASSERT_PRINT(fmt, ...)
28#endif /* CONFIG_ASSERT_VERBOSE */
29
30#ifdef CONFIG_ASSERT_NO_MSG_INFO
31#define __ASSERT_MSG_INFO(fmt, ...)
32#else /* CONFIG_ASSERT_NO_MSG_INFO */
33#define __ASSERT_MSG_INFO(fmt, ...) __ASSERT_PRINT("\t" fmt "\n", ##__VA_ARGS__)
34#endif /* CONFIG_ASSERT_NO_MSG_INFO */
35
36#if !defined(CONFIG_ASSERT_NO_COND_INFO) && !defined(CONFIG_ASSERT_NO_FILE_INFO)
37#define __ASSERT_LOC(test) \
38 __ASSERT_PRINT("ASSERTION FAIL [%s] @ %s:%d\n", \
39 Z_STRINGIFY(test), \
40 __FILE__, __LINE__)
41#endif
42
43#if defined(CONFIG_ASSERT_NO_COND_INFO) && !defined(CONFIG_ASSERT_NO_FILE_INFO)
44#define __ASSERT_LOC(test) \
45 __ASSERT_PRINT("ASSERTION FAIL @ %s:%d\n", \
46 __FILE__, __LINE__)
47#endif
48
49#if !defined(CONFIG_ASSERT_NO_COND_INFO) && defined(CONFIG_ASSERT_NO_FILE_INFO)
50#define __ASSERT_LOC(test) \
51 __ASSERT_PRINT("ASSERTION FAIL [%s]\n", \
52 Z_STRINGIFY(test))
53#endif
54
55#if defined(CONFIG_ASSERT_NO_COND_INFO) && defined(CONFIG_ASSERT_NO_FILE_INFO)
56#define __ASSERT_LOC(test) \
57 __ASSERT_PRINT("ASSERTION FAIL\n")
58#endif
59
60#if defined(CONFIG_ASSERT) && !defined(CONFIG_FORCE_NO_ASSERT) && \
61 defined(CONFIG_ASSERT_LEVEL) && (CONFIG_ASSERT_LEVEL > 0)
62
63BUILD_ASSERT(CONFIG_ASSERT_LEVEL >= 0 && CONFIG_ASSERT_LEVEL <= 2,
64 "Invalid CONFIG_ASSERT_LEVEL: must be between 0 and 2");
65
66#if CONFIG_ASSERT_LEVEL == 1
67#warning "__ASSERT() statements are ENABLED"
68#endif /* CONFIG_ASSERT_LEVEL == 1 */
69#ifdef __cplusplus
70extern "C" {
71#endif
72
73#ifdef CONFIG_ASSERT_NO_FILE_INFO
74void assert_post_action(void);
75#define __ASSERT_POST_ACTION() assert_post_action()
76#else /* CONFIG_ASSERT_NO_FILE_INFO */
77void assert_post_action(const char *file, unsigned int line);
78#define __ASSERT_POST_ACTION() assert_post_action(__FILE__, __LINE__)
79#endif /* CONFIG_ASSERT_NO_FILE_INFO */
80
81/*
82 * When the assert test mode is enabled, the default kernel fatal error handler
83 * and the custom assert hook function may return in order to allow the test to
84 * proceed.
85 */
86#ifdef CONFIG_ASSERT_TEST
87#define __ASSERT_UNREACHABLE
88#else
89#define __ASSERT_UNREACHABLE CODE_UNREACHABLE
90#endif
91
92#ifdef __cplusplus
93}
94#endif
95
96#define __ASSERT_NO_MSG(test) \
97 do { \
98 if (unlikely(!(test))) { \
99 __ASSERT_LOC(test); \
100 __ASSERT_POST_ACTION(); \
101 __ASSERT_UNREACHABLE; \
102 } \
103 } while (false)
104
105#define __ASSERT(test, fmt, ...) \
106 do { \
107 if (unlikely(!(test))) { \
108 __ASSERT_LOC(test); \
109 __ASSERT_MSG_INFO(fmt, ##__VA_ARGS__); \
110 __ASSERT_POST_ACTION(); \
111 __ASSERT_UNREACHABLE; \
112 } \
113 } while (false)
114
115#define __ASSERT_EVAL(expr1, expr2, test, fmt, ...) \
116 do { \
117 expr2; \
118 __ASSERT(test, fmt, ##__VA_ARGS__); \
119 } while (false)
120
121
122#else
123
124#define __ASSERT(test, fmt, ...) { }
125#define __ASSERT_EVAL(expr1, expr2, test, fmt, ...) expr1
126#define __ASSERT_NO_MSG(test) { }
127#define __ASSERT_POST_ACTION() { }
128
129#endif
130
131#ifdef CONFIG_ASSERT_CUSTOM_HEADER
132/* This include must always be at the end of __assert.h */
133#include <zephyr_custom_assert.h>
134#endif
135
136#endif /* ZEPHYR_INCLUDE_SYS___ASSERT_H_ */
void assert_print(const char *fmt,...)
#define BUILD_ASSERT(EXPR, MSG...)
Definition llvm.h:51
Macros to abstract toolchain specific capabilities.