Annotation of embedaddon/ntp/include/ntp_assert.h, revision 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>