File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / ntp / include / ntp_assert.h
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue May 29 12:08:38 2012 UTC (12 years, 4 months ago) by misho
Branches: ntp, MAIN
CVS tags: v4_2_6p5p0, v4_2_6p5, HEAD
ntp 4.2.6p5

    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>