assertions.h revision 290001
1/*
2 * Copyright (C) 2004-2009  Internet Systems Consortium, Inc. ("ISC")
3 * Copyright (C) 1997-2001  Internet Software Consortium.
4 *
5 * Permission to use, copy, modify, and/or distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
10 * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
11 * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
12 * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
13 * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
14 * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
15 * PERFORMANCE OF THIS SOFTWARE.
16 */
17
18/*
19 * $Id: assertions.h,v 1.28 2009/09/29 23:48:04 tbox Exp $
20 */
21/*! \file isc/assertions.h
22 */
23
24#ifndef ISC_ASSERTIONS_H
25#define ISC_ASSERTIONS_H 1
26
27#include <isc/lang.h>
28#include <isc/platform.h>
29
30ISC_LANG_BEGINDECLS
31
32/*% isc assertion type */
33typedef enum {
34	isc_assertiontype_require,
35	isc_assertiontype_ensure,
36	isc_assertiontype_insist,
37	isc_assertiontype_invariant
38} isc_assertiontype_t;
39
40typedef void (*isc_assertioncallback_t)(const char *, int, isc_assertiontype_t,
41					const char *);
42
43/* coverity[+kill] */
44ISC_PLATFORM_NORETURN_PRE
45void isc_assertion_failed(const char *, int, isc_assertiontype_t,
46			  const char *) ISC_PLATFORM_NORETURN_POST;
47
48void
49isc_assertion_setcallback(isc_assertioncallback_t);
50
51const char *
52isc_assertion_typetotext(isc_assertiontype_t type);
53
54#if defined(ISC_CHECK_ALL) || defined(__COVERITY__)
55#define ISC_CHECK_REQUIRE		1
56#define ISC_CHECK_ENSURE		1
57#define ISC_CHECK_INSIST		1
58#define ISC_CHECK_INVARIANT		1
59#endif
60
61#if defined(ISC_CHECK_NONE) && !defined(__COVERITY__)
62#define ISC_CHECK_REQUIRE		0
63#define ISC_CHECK_ENSURE		0
64#define ISC_CHECK_INSIST		0
65#define ISC_CHECK_INVARIANT		0
66#endif
67
68#ifndef ISC_CHECK_REQUIRE
69#define ISC_CHECK_REQUIRE		1
70#endif
71
72#ifndef ISC_CHECK_ENSURE
73#define ISC_CHECK_ENSURE		1
74#endif
75
76#ifndef ISC_CHECK_INSIST
77#define ISC_CHECK_INSIST		1
78#endif
79
80#ifndef ISC_CHECK_INVARIANT
81#define ISC_CHECK_INVARIANT		1
82#endif
83
84#if ISC_CHECK_REQUIRE != 0
85#define ISC_REQUIRE(cond) \
86	((void) ((cond) || \
87		 ((isc_assertion_failed)(__FILE__, __LINE__, \
88					 isc_assertiontype_require, \
89					 #cond), 0)))
90#else
91#define ISC_REQUIRE(cond)	((void) 0)
92#endif /* ISC_CHECK_REQUIRE */
93
94#if ISC_CHECK_ENSURE != 0
95#define ISC_ENSURE(cond) \
96	((void) ((cond) || \
97		 ((isc_assertion_failed)(__FILE__, __LINE__, \
98					 isc_assertiontype_ensure, \
99					 #cond), 0)))
100#else
101#define ISC_ENSURE(cond)	((void) 0)
102#endif /* ISC_CHECK_ENSURE */
103
104#if ISC_CHECK_INSIST != 0
105#define ISC_INSIST(cond) \
106	((void) ((cond) || \
107		 ((isc_assertion_failed)(__FILE__, __LINE__, \
108					 isc_assertiontype_insist, \
109					 #cond), 0)))
110#else
111#define ISC_INSIST(cond)	((void) 0)
112#endif /* ISC_CHECK_INSIST */
113
114#if ISC_CHECK_INVARIANT != 0
115#define ISC_INVARIANT(cond) \
116	((void) ((cond) || \
117		 ((isc_assertion_failed)(__FILE__, __LINE__, \
118					 isc_assertiontype_invariant, \
119					 #cond), 0)))
120#else
121#define ISC_INVARIANT(cond)	((void) 0)
122#endif /* ISC_CHECK_INVARIANT */
123
124ISC_LANG_ENDDECLS
125
126#endif /* ISC_ASSERTIONS_H */
127