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 * NOTE: this macro is INTERNAL and should not be used outside of this header!
86 */
87#ifdef CONFIG_ASSERT_TEST
88#define __ASSERT_AFTER_TRIGGER_UNREACHABILITY_MARKER
89#else
90#define __ASSERT_AFTER_TRIGGER_UNREACHABILITY_MARKER CODE_UNREACHABLE
91#endif
92
93#ifdef __cplusplus
94}
95#endif
96
97#define __ASSERT_NO_MSG(test) \
98 do { \
99 if (unlikely(!(test))) { \
100 __ASSERT_LOC(test); \
101 __ASSERT_POST_ACTION(); \
102 __ASSERT_AFTER_TRIGGER_UNREACHABILITY_MARKER; \
103 } \
104 } while (false)
105
106#define __ASSERT(test, fmt, ...) \
107 do { \
108 if (unlikely(!(test))) { \
109 __ASSERT_LOC(test); \
110 __ASSERT_MSG_INFO(fmt, ##__VA_ARGS__); \
111 __ASSERT_POST_ACTION(); \
112 __ASSERT_AFTER_TRIGGER_UNREACHABILITY_MARKER; \
113 } \
114 } while (false)
115
116#define __ASSERT_EVAL(expr1, expr2, test, fmt, ...) \
117 do { \
118 expr2; \
119 __ASSERT(test, fmt, ##__VA_ARGS__); \
120 } while (false)
121
122
123#else
124
125#define __ASSERT(test, fmt, ...) { }
126#define __ASSERT_EVAL(expr1, expr2, test, fmt, ...) expr1
127#define __ASSERT_NO_MSG(test) { }
128#define __ASSERT_POST_ACTION() { }
129
130#endif
131
132#ifdef CONFIG_ASSERT_CUSTOM_HEADER
133/* This include must always be at the end of __assert.h */
134#include <zephyr_custom_assert.h>
135#endif
136
137#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.