diff --git a/configure.ac b/configure.ac index bd59fabd7..10ae2c2eb 100644 --- a/configure.ac +++ b/configure.ac @@ -120,6 +120,7 @@ CC_CHECK_FLAGS_APPEND([AM_CFLAGS],[CFLAGS],[ \ -Wdate-time \ -Wnested-externs \ -Wconversion \ + -Wno-format-nonliteral \ -Werror \ ]) # To enable: diff --git a/src/lib/sm.c b/src/lib/sm.c index 5c1e696fd..9453c1fca 100644 --- a/src/lib/sm.c +++ b/src/lib/sm.c @@ -22,16 +22,27 @@ int sm_state(const struct sm *m) static inline void sm_obs(const struct sm *m) { - tracef("%s pid: %d sm_id: %" PRIu64 " %s |\n", + tracef("%s pid: %d sm_id: %" PRIu64 " %s |", m->name, m->pid, m->id, m->conf[sm_state(m)].name); } void sm_relate(const struct sm *from, const struct sm *to) { - tracef("%s-to-%s opid: %d dpid: %d id: %" PRIu64 " id: %" PRIu64 " |\n", + tracef("%s-to-%s opid: %d dpid: %d id: %" PRIu64 " id: %" PRIu64 " |", from->name, to->name, from->pid, to->pid, from->id, to->id); } +void sm_attr(const struct sm *m, const char *k, const char *fmt, ...) +{ + char v[SM_MAX_ATTR_LENGTH]; + va_list ap; + va_start(ap, fmt); + vsnprintf(v, sizeof(v), fmt, ap); + va_end(ap); + tracef("%s-attr pid: %d sm_id: %" PRIu64 " %s %s |", + m->name, m->pid, m->id, k, v); +} + void sm_init(struct sm *m, bool (*invariant)(const struct sm *, int), bool (*is_locked)(const struct sm *), @@ -49,6 +60,7 @@ void sm_init(struct sm *m, m->is_locked = is_locked; m->id = ++id; m->pid = getpid(); + m->rc = 0; snprintf(m->name, SM_MAX_NAME_LENGTH, "%s", name); sm_obs(m); @@ -82,12 +94,13 @@ void sm_fail(struct sm *m, int fail_state, int rc) m->rc = rc; m->state = fail_state; + sm_obs(m); POST(m->invariant != NULL && m->invariant(m, prev)); } static __attribute__((noinline)) bool check_failed(const char *f, int n, const char *s) { - tracef("%s:%d check failed: %s\n", f, n, s); + tracef("%s:%d check failed: %s", f, n, s); return false; } diff --git a/src/lib/sm.h b/src/lib/sm.h index e4c9b2a39..d7f72c23f 100644 --- a/src/lib/sm.h +++ b/src/lib/sm.h @@ -10,6 +10,7 @@ #define CHECK(cond) sm_check((cond), __FILE__, __LINE__, #cond) #define SM_MAX_NAME_LENGTH 50 +#define SM_MAX_ATTR_LENGTH 100 enum { SM_PREV_NONE = -1, @@ -54,5 +55,9 @@ int sm_state(const struct sm *m); bool sm_check(bool b, const char *f, int n, const char *s); /* Relates one state machine to another for observability. */ void sm_relate(const struct sm *from, const struct sm *to); +/** + * Records an attribute of a state machine for observability. + */ +void sm_attr(const struct sm *m, const char *k, const char *fmt, ...); #endif /* __LIB_SM__ */ diff --git a/src/logger.c b/src/logger.c index 92bdf919e..78614249d 100644 --- a/src/logger.c +++ b/src/logger.c @@ -36,10 +36,7 @@ void loggerDefaultEmit(void *data, int level, const char *fmt, va_list args) /* Then render the message, possibly truncating it. */ n = EMIT_BUF_LEN - strlen(buf) - 1; -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wformat-nonliteral" vsnprintf(cursor, n, fmt, args); -#pragma GCC diagnostic pop fprintf(stderr, "%s\n", buf); } diff --git a/test/lib/logger.c b/test/lib/logger.c index 2970254fa..20d2588c4 100644 --- a/test/lib/logger.c +++ b/test/lib/logger.c @@ -34,10 +34,7 @@ void test_logger_emit(void *data, int level, const char *format, va_list args) sprintf(buf + strlen(buf), "%2d -> [%s] ", t->id, level_name); -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wformat-nonliteral" vsnprintf(buf + strlen(buf), 1024 - strlen(buf), format, args); -#pragma GCC diagnostic pop munit_log(MUNIT_LOG_INFO, buf); return;