X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvppinfra%2Ferror_bootstrap.h;h=185f4c6c4af86147b127a186c7a991219d3adb1a;hb=70ae0a9682709ede68de467c9932472ea3c0e100;hp=3416c2f90331750b2ad81392123fe3103a4c5b51;hpb=7cd468a3d7dee7d6c92f69a0bb7061ae208ec727;p=vpp.git diff --git a/src/vppinfra/error_bootstrap.h b/src/vppinfra/error_bootstrap.h index 3416c2f9033..185f4c6c4af 100644 --- a/src/vppinfra/error_bootstrap.h +++ b/src/vppinfra/error_bootstrap.h @@ -79,15 +79,50 @@ do { \ } \ } while (0) -#if defined(__clang__) -#define STATIC_ASSERT(truth,...) -#else +/* + * This version always generates code, and has a Coverity-specific + * version to stop Coverity complaining about + * ALWAYS_ASSERT(p != 0); p->member... + */ + +#ifndef __COVERITY__ +#define ALWAYS_ASSERT(truth) \ +do { \ + if (PREDICT_FALSE(!(truth))) \ + { \ + _clib_error (CLIB_ERROR_ABORT, 0, 0, \ + "%s:%d (%s) assertion `%s' fails", \ + __FILE__, \ + (uword) __LINE__, \ + clib_error_function, \ + # truth); \ + } \ +} while (0) +#else /* __COVERITY__ */ +#define ALWAYS_ASSERT(truth) \ +do { \ + if (PREDICT_FALSE(!(truth))) \ + { \ + abort(); \ + } \ +} while (0) +#endif /* __COVERITY */ + #define STATIC_ASSERT(truth,...) _Static_assert(truth, __VA_ARGS__) -#endif #define STATIC_ASSERT_SIZEOF(d, s) \ STATIC_ASSERT (sizeof (d) == s, "Size of " #d " must be " # s " bytes") +#define STATIC_ASSERT_SIZEOF_ELT(d, e, s) \ + STATIC_ASSERT (sizeof (((d *)0)->e) == s, "Size of " #d "." #e " must be " # s " bytes") + +#define STATIC_ASSERT_OFFSET_OF(s, e, o) \ + STATIC_ASSERT (STRUCT_OFFSET_OF(s,e) == o, "Offset of " #s "." #e " must be " # o) + +#define STATIC_ASSERT_FITS_IN(s, e, o) \ + STATIC_ASSERT (STRUCT_OFFSET_OF(s,e) <= (o - sizeof(((s *)0)->e)), \ + #s "." #e " does not fit into " # o " bytes") + /* Assert without allocating memory. */ #define ASSERT_AND_PANIC(truth) \ do { \