From a0d0a71a1828cce725c3132f8c243bf0c537786f Mon Sep 17 00:00:00 2001 From: Maria Matejka Date: Wed, 14 Aug 2019 16:22:39 +0200 Subject: [PATCH] Expensive check declaration Intended to be run at every operation with complex data structures to check their consistency and validity. --- configure.ac | 13 +++++++++++++ lib/birdlib.h | 7 +++++++ 2 files changed, 20 insertions(+) diff --git a/configure.ac b/configure.ac index da8546a6..96f66644 100644 --- a/configure.ac +++ b/configure.ac @@ -24,6 +24,12 @@ AC_ARG_ENABLE([debug-generated], [enable_debug_generated=no] ) +AC_ARG_ENABLE([debug-expensive], + [AS_HELP_STRING([--enable-debug-expensive], [enable expensive consistency checks (implies --enable-debug) @<:@no@:>@])], + [], + [enable_debug_expensive=no] +) + AC_ARG_ENABLE([memcheck], [AS_HELP_STRING([--enable-memcheck], [check memory allocations when debugging @<:@yes@:>@])], [], @@ -72,6 +78,9 @@ AC_ARG_VAR([FLEX], [location of the Flex program]) AC_ARG_VAR([BISON], [location of the Bison program]) AC_ARG_VAR([M4], [location of the M4 program]) +if test "$enable_debug_expensive" = yes; then + enable_debug = yes +fi if test "$srcdir" = . ; then # Building in current directory => create obj directory holding all objects @@ -388,6 +397,10 @@ if test "$enable_debug" = yes ; then AC_CHECK_LIB([efence], [malloc]) fi fi + + if test "enable_debug_expensive" = yes ; then + AC_DEFINE([ENABLE_EXPENSIVE_CHECKS], [1], [Define to 1 if you want to run expensive consistency checks.]) + fi fi CLIENT=birdcl diff --git a/lib/birdlib.h b/lib/birdlib.h index caa26b94..23036c1b 100644 --- a/lib/birdlib.h +++ b/lib/birdlib.h @@ -165,14 +165,21 @@ void debug(const char *msg, ...); /* Printf to debug output */ #define ASSERT_DIE(x) do { if (!(x)) bug("Assertion '%s' failed at %s:%d", #x, __FILE__, __LINE__); } while(0) +#define EXPENSIVE_CHECK(x) /* intentionally left blank */ + #ifdef DEBUGGING #define ASSERT(x) ASSERT_DIE(x) #define ASSUME(x) ASSERT_DIE(x) +#ifdef ENABLE_EXPENSIVE_CHECKS +#undef EXPENSIVE_CHECK +#define EXPENSIVE_CHECK(x) ASSERT_DIE(x) +#endif #else #define ASSERT(x) do { if (!(x)) log(L_BUG "Assertion '%s' failed at %s:%d", #x, __FILE__, __LINE__); } while(0) #define ASSUME(x) /* intentionally left blank */ #endif + #ifdef DEBUGGING asm( ".pushsection \".debug_gdb_scripts\", \"MS\",@progbits,1\n"