diff options
| author | Lennart Poettering <lennart@poettering.net> | 2015-09-16 16:27:00 +0200 | 
|---|---|---|
| committer | Lennart Poettering <lennart@poettering.net> | 2015-09-16 16:27:00 +0200 | 
| commit | b91a501fcd618a7f7a34e64cec9f74394fb0bad8 (patch) | |
| tree | 7c1e487c66797d6a73c1a0cc55a73294896489e5 | |
| parent | ac2896bab61bd8cd0b8a8b92f8347e2c11a088b5 (diff) | |
| parent | a8b626100b88b50c6c73fccf81b278d64e7e25a2 (diff) | |
Merge pull request #1278 from michich/nicer-asserts
nicer assert messages
| -rw-r--r-- | src/basic/macro.h | 27 | ||||
| -rw-r--r-- | src/basic/time-util.h | 4 | ||||
| -rw-r--r-- | src/basic/util.h | 4 | ||||
| -rw-r--r-- | src/libsystemd/sd-bus/bus-internal.h | 2 | 
4 files changed, 23 insertions, 14 deletions
| diff --git a/src/basic/macro.h b/src/basic/macro.h index cbc3ca97b8..248f7a86dd 100644 --- a/src/basic/macro.h +++ b/src/basic/macro.h @@ -123,8 +123,11 @@ static inline unsigned long ALIGN_POWER2(unsigned long u) {          return 1UL << (sizeof(u) * 8 - __builtin_clzl(u - 1UL));  } -#define ELEMENTSOF(x) (sizeof(x)/sizeof((x)[0])) - +#define ELEMENTSOF(x)                                                    \ +        __extension__ (__builtin_choose_expr(                            \ +                !__builtin_types_compatible_p(typeof(x), typeof(&*(x))), \ +                sizeof(x)/sizeof((x)[0]),                                \ +                (void)0))  /*   * container_of - cast a member of a structure out to the containing structure   * @ptr: the pointer to the member. @@ -213,18 +216,20 @@ static inline unsigned long ALIGN_POWER2(unsigned long u) {                  (__x / __y + !!(__x % __y));                            \          }) -#define assert_se(expr)                                                 \ +#define assert_message_se(expr, message)                                \          do {                                                            \                  if (_unlikely_(!(expr)))                                \ -                        log_assert_failed(#expr, __FILE__, __LINE__, __PRETTY_FUNCTION__); \ -        } while (false)                                                 \ +                        log_assert_failed(message, __FILE__, __LINE__, __PRETTY_FUNCTION__); \ +        } while (false) + +#define assert_se(expr) assert_message_se(expr, #expr)  /* We override the glibc assert() here. */  #undef assert  #ifdef NDEBUG  #define assert(expr) do {} while(false)  #else -#define assert(expr) assert_se(expr) +#define assert(expr) assert_message_se(expr, #expr)  #endif  #define assert_not_reached(t)                                           \ @@ -249,19 +254,19 @@ static inline unsigned long ALIGN_POWER2(unsigned long u) {          REENABLE_WARNING  #endif -#define assert_log(expr) ((_likely_(expr))      \ -        ? (true)                                \ -        : (log_assert_failed_return(#expr, __FILE__, __LINE__, __PRETTY_FUNCTION__), false)) +#define assert_log(expr, message) ((_likely_(expr))                     \ +        ? (true)                                                        \ +        : (log_assert_failed_return(message, __FILE__, __LINE__, __PRETTY_FUNCTION__), false))  #define assert_return(expr, r)                                          \          do {                                                            \ -                if (!assert_log(expr))                                  \ +                if (!assert_log(expr, #expr))                           \                          return (r);                                     \          } while (false)  #define assert_return_errno(expr, r, err)                               \          do {                                                            \ -                if (!assert_log(expr)) {                                \ +                if (!assert_log(expr, #expr)) {                         \                          errno = err;                                    \                          return (r);                                     \                  }                                                       \ diff --git a/src/basic/time-util.h b/src/basic/time-util.h index de881e8fe1..1af01541fc 100644 --- a/src/basic/time-util.h +++ b/src/basic/time-util.h @@ -112,6 +112,8 @@ bool timezone_is_valid(const char *name);  clockid_t clock_boottime_or_monotonic(void); -#define xstrftime(buf, fmt, tm) assert_se(strftime(buf, ELEMENTSOF(buf), fmt, tm) > 0) +#define xstrftime(buf, fmt, tm) \ +        assert_message_se(strftime(buf, ELEMENTSOF(buf), fmt, tm) > 0, \ +                          "xstrftime: " #buf "[] must be big enough")  int get_timezone(char **timezone); diff --git a/src/basic/util.h b/src/basic/util.h index c7dff9a86d..8abaa740b2 100644 --- a/src/basic/util.h +++ b/src/basic/util.h @@ -374,7 +374,9 @@ DEFINE_TRIVIAL_CLEANUP_FUNC(cpu_set_t*, CPU_FREE);  cpu_set_t* cpu_set_malloc(unsigned *ncpus); -#define xsprintf(buf, fmt, ...) assert_se((size_t) snprintf(buf, ELEMENTSOF(buf), fmt, __VA_ARGS__) < ELEMENTSOF(buf)) +#define xsprintf(buf, fmt, ...) \ +        assert_message_se((size_t) snprintf(buf, ELEMENTSOF(buf), fmt, __VA_ARGS__) < ELEMENTSOF(buf), \ +                          "xsprintf: " #buf "[] must be big enough")  int files_same(const char *filea, const char *fileb); diff --git a/src/libsystemd/sd-bus/bus-internal.h b/src/libsystemd/sd-bus/bus-internal.h index 7af61a9433..e399701beb 100644 --- a/src/libsystemd/sd-bus/bus-internal.h +++ b/src/libsystemd/sd-bus/bus-internal.h @@ -396,6 +396,6 @@ int bus_maybe_reply_error(sd_bus_message *m, int r, sd_bus_error *error);  #define bus_assert_return(expr, r, error)                               \          do {                                                            \ -                if (!assert_log(expr))                                  \ +                if (!assert_log(expr, #expr))                           \                          return sd_bus_error_set_errno(error, r);        \          } while (false) | 
