Annotation of embedaddon/ntp/include/ntp_assert.h, revision 1.1.1.1
1.1 misho 1: /*
2: * ntp_assert.h - design by contract stuff
3: *
4: * example:
5: *
6: * int foo(char *a) {
7: * int result;
8: * int value;
9: *
10: * REQUIRE(a != NULL);
11: * ...
12: * bar(&value);
13: * INSIST(value > 2);
14: * ...
15: *
16: * ENSURE(result != 12);
17: * return result;
18: * }
19: *
20: * open question: when would we use INVARIANT()?
21: *
22: * For cases where the overhead for non-debug builds is deemed too high,
23: * use DEBUG_REQUIRE(), DEBUG_INSIST(), DEBUG_ENSURE(), and/or
24: * DEBUG_INVARIANT().
25: */
26:
27: #ifndef NTP_ASSERT_H
28: #define NTP_ASSERT_H
29:
30: # ifdef CALYSTO
31:
32: extern void calysto_assume(unsigned char cnd); /* assume this always holds */
33: extern void calysto_assert(unsigned char cnd); /* check whether this holds */
34: #define ALWAYS_REQUIRE(x) calysto_assert(x)
35: #define ALWAYS_INSIST(x) calysto_assume(x) /* DLH calysto_assert()? */
36: #define ALWAYS_INVARIANT(x) calysto_assume(x)
37: #define ALWAYS_ENSURE(x) calysto_assert(x)
38:
39: /* # elif defined(__COVERITY__) */
40: /*
41: * DH: try letting coverity scan our actual assertion macros, now that
42: * isc_assertioncallback_t is marked __attribute__ __noreturn__.
43: */
44:
45: /*
46: * Coverity has special knowledge that assert(x) terminates the process
47: * if x is not true. Rather than teach it about our assertion macros,
48: * just use the one it knows about for Coverity Prevent scans. This
49: * means our assertion code (and ISC's) escapes Coverity analysis, but
50: * that seems to be a reasonable trade-off.
51: */
52:
53: /*
54: #define ALWAYS_REQUIRE(x) assert(x)
55: #define ALWAYS_INSIST(x) assert(x)
56: #define ALWAYS_INVARIANT(x) assert(x)
57: #define ALWAYS_ENSURE(x) assert(x)
58: */
59:
60: # else /* neither Coverity nor Calysto */
61:
62: #include "isc/assertions.h"
63:
64: #define ALWAYS_REQUIRE(x) ISC_REQUIRE(x)
65: #define ALWAYS_INSIST(x) ISC_INSIST(x)
66: #define ALWAYS_INVARIANT(x) ISC_INVARIANT(x)
67: #define ALWAYS_ENSURE(x) ISC_ENSURE(x)
68:
69: # endif /* neither Coverity nor Calysto */
70:
71: #define REQUIRE(x) ALWAYS_REQUIRE(x)
72: #define INSIST(x) ALWAYS_INSIST(x)
73: #define INVARIANT(x) ALWAYS_INVARIANT(x)
74: #define ENSURE(x) ALWAYS_ENSURE(x)
75:
76: /*
77: * We initially used NTP_REQUIRE() instead of REQUIRE() etc, but that
78: * is unneccesarily verbose, as libisc use of REQUIRE() etc shows.
79: */
80: #define NTP_REQUIRE(x) REQUIRE(x)
81: #define NTP_INSIST(x) INSIST(x)
82: #define NTP_INVARIANT(x) INVARIANT(x)
83: #define NTP_ENSURE(x) ENSURE(x)
84:
85: # ifdef DEBUG
86: #define DEBUG_REQUIRE(x) REQUIRE(x)
87: #define DEBUG_INSIST(x) INSIST(x)
88: #define DEBUG_INVARIANT(x) INVARIANT(x)
89: #define DEBUG_ENSURE(x) ENSURE(x)
90: # else
91: #define DEBUG_REQUIRE(x) (void)(x)
92: #define DEBUG_INSIST(x) (void)(x)
93: #define DEBUG_INVARIANT(x) (void)(x)
94: #define DEBUG_ENSURE(x) (void)(x)
95: # endif
96:
97: #endif /* NTP_ASSERT_H */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>