Zephyr API Documentation  2.7.0-rc2
A Scalable Open Source RTOS
__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
12#ifdef CONFIG_ASSERT
13#ifndef __ASSERT_ON
14#define __ASSERT_ON CONFIG_ASSERT_LEVEL
15#endif
16#endif
17
18#ifdef CONFIG_FORCE_NO_ASSERT
19#undef __ASSERT_ON
20#define __ASSERT_ON 0
21#endif
22
23#if defined(CONFIG_ASSERT_VERBOSE)
24#define __ASSERT_PRINT(fmt, ...) printk(fmt, ##__VA_ARGS__)
25#else /* CONFIG_ASSERT_VERBOSE */
26#define __ASSERT_PRINT(fmt, ...)
27#endif /* CONFIG_ASSERT_VERBOSE */
28
29#ifdef CONFIG_ASSERT_NO_MSG_INFO
30#define __ASSERT_MSG_INFO(fmt, ...)
31#else /* CONFIG_ASSERT_NO_MSG_INFO */
32#define __ASSERT_MSG_INFO(fmt, ...) __ASSERT_PRINT("\t" fmt "\n", ##__VA_ARGS__)
33#endif /* CONFIG_ASSERT_NO_MSG_INFO */
34
35#if !defined(CONFIG_ASSERT_NO_COND_INFO) && !defined(CONFIG_ASSERT_NO_FILE_INFO)
36#define __ASSERT_LOC(test) \
37 __ASSERT_PRINT("ASSERTION FAIL [%s] @ %s:%d\n", \
38 Z_STRINGIFY(test), \
39 __FILE__, __LINE__)
40#endif
41
42#if defined(CONFIG_ASSERT_NO_COND_INFO) && !defined(CONFIG_ASSERT_NO_FILE_INFO)
43#define __ASSERT_LOC(test) \
44 __ASSERT_PRINT("ASSERTION FAIL @ %s:%d\n", \
45 __FILE__, __LINE__)
46#endif
47
48#if !defined(CONFIG_ASSERT_NO_COND_INFO) && defined(CONFIG_ASSERT_NO_FILE_INFO)
49#define __ASSERT_LOC(test) \
50 __ASSERT_PRINT("ASSERTION FAIL [%s]\n", \
51 Z_STRINGIFY(test))
52#endif
53
54#if defined(CONFIG_ASSERT_NO_COND_INFO) && defined(CONFIG_ASSERT_NO_FILE_INFO)
55#define __ASSERT_LOC(test) \
56 __ASSERT_PRINT("ASSERTION FAIL\n")
57#endif
58
59#ifdef __ASSERT_ON
60#if (__ASSERT_ON < 0) || (__ASSERT_ON > 2)
61#error "Invalid __ASSERT() level: must be between 0 and 2"
62#endif
63
64#if __ASSERT_ON
65
66#include <sys/printk.h>
67
68#ifdef __cplusplus
69extern "C" {
70#endif
71
72#ifdef CONFIG_ASSERT_NO_FILE_INFO
73void assert_post_action(void);
74#define __ASSERT_POST_ACTION() assert_post_action()
75#else /* CONFIG_ASSERT_NO_FILE_INFO */
76void assert_post_action(const char *file, unsigned int line);
77#define __ASSERT_POST_ACTION() assert_post_action(__FILE__, __LINE__)
78#endif /* CONFIG_ASSERT_NO_FILE_INFO */
79
80#ifdef __cplusplus
81}
82#endif
83
84#define __ASSERT_NO_MSG(test) \
85 do { \
86 if (!(test)) { \
87 __ASSERT_LOC(test); \
88 __ASSERT_POST_ACTION(); \
89 } \
90 } while (false)
91
92#define __ASSERT(test, fmt, ...) \
93 do { \
94 if (!(test)) { \
95 __ASSERT_LOC(test); \
96 __ASSERT_MSG_INFO(fmt, ##__VA_ARGS__); \
97 __ASSERT_POST_ACTION(); \
98 } \
99 } while (false)
100
101#define __ASSERT_EVAL(expr1, expr2, test, fmt, ...) \
102 do { \
103 expr2; \
104 __ASSERT(test, fmt, ##__VA_ARGS__); \
105 } while (false)
106
107#if (__ASSERT_ON == 1)
108#warning "__ASSERT() statements are ENABLED"
109#endif
110#else
111#define __ASSERT(test, fmt, ...) { }
112#define __ASSERT_EVAL(expr1, expr2, test, fmt, ...) expr1
113#define __ASSERT_NO_MSG(test) { }
114#endif
115#else
116#define __ASSERT(test, fmt, ...) { }
117#define __ASSERT_EVAL(expr1, expr2, test, fmt, ...) expr1
118#define __ASSERT_NO_MSG(test) { }
119#endif
120
121#endif /* ZEPHYR_INCLUDE_SYS___ASSERT_H_ */
void assert_post_action(const char *file, unsigned int line)
Definition: spinlock_error_case.c:33