From ec91206fbe5e14731f9c9fa0b3dd859854d3e8b9 Mon Sep 17 00:00:00 2001 From: Christos Zoulas Date: Sun, 30 Sep 2018 17:16:07 -0400 Subject: Add a format attribute to the format functions and fix the broken format strings. Reviewed-by: Richard Levitte Reviewed-by: Viktor Dukhovni --- test/testutil/format_output.c | 16 ++++++++-------- test/testutil/main.c | 2 +- test/testutil/output.h | 34 +++++++++++++++++++++++++++++----- 3 files changed, 38 insertions(+), 14 deletions(-) (limited to 'test') diff --git a/test/testutil/format_output.c b/test/testutil/format_output.c index ead03841d5..7f5147516e 100644 --- a/test/testutil/format_output.c +++ b/test/testutil/format_output.c @@ -31,9 +31,9 @@ static void test_diff_header(const char *left, const char *right) static void test_string_null_empty(const char *m, char c) { if (m == NULL) - test_printf_stderr("% 4s %c NULL\n", "", c); + test_printf_stderr("%4s %c NULL\n", "", c); else - test_printf_stderr("% 4u:%c ''\n", 0u, c); + test_printf_stderr("%4u:%c ''\n", 0u, c); } static void test_fail_string_common(const char *prefix, const char *file, @@ -94,18 +94,18 @@ static void test_fail_string_common(const char *prefix, const char *file, bdiff[i] = '\0'; } if (n1 == n2 && !diff) { - test_printf_stderr("% 4u: '%s'\n", cnt, n2 > n1 ? b2 : b1); + test_printf_stderr("%4u: '%s'\n", cnt, n2 > n1 ? b2 : b1); } else { if (cnt == 0 && (m1 == NULL || *m1 == '\0')) test_string_null_empty(m1, '-'); else if (n1 > 0) - test_printf_stderr("% 4u:- '%s'\n", cnt, b1); + test_printf_stderr("%4u:- '%s'\n", cnt, b1); if (cnt == 0 && (m2 == NULL || *m2 == '\0')) test_string_null_empty(m2, '+'); else if (n2 > 0) - test_printf_stderr("% 4u:+ '%s'\n", cnt, b2); + test_printf_stderr("%4u:+ '%s'\n", cnt, b2); if (diff && i > 0) - test_printf_stderr("% 4s %s\n", "", bdiff); + test_printf_stderr("%4s %s\n", "", bdiff); } m1 += n1; m2 += n2; @@ -410,7 +410,7 @@ void test_output_bignum(const char *name, const BIGNUM *bn) static void test_memory_null_empty(const unsigned char *m, char c) { if (m == NULL) - test_printf_stderr("% 4s %c%s\n", "", c, "NULL"); + test_printf_stderr("%4s %c%s\n", "", c, "NULL"); else test_printf_stderr("%04x %c%s\n", 0u, c, "empty"); } @@ -494,7 +494,7 @@ static void test_fail_memory_common(const char *prefix, const char *file, else if (n2 > 0) test_printf_stderr("%04x:+%s\n", cnt, b2); if (diff && i > 0) - test_printf_stderr("% 4s %s\n", "", bdiff); + test_printf_stderr("%4s %s\n", "", bdiff); } m1 += n1; m2 += n2; diff --git a/test/testutil/main.c b/test/testutil/main.c index 458d4805f3..9dc651b61b 100644 --- a/test/testutil/main.c +++ b/test/testutil/main.c @@ -25,7 +25,7 @@ static void check_arg_usage(void) for (i = 0; i < n; i++) if (!arg_used[i+1]) - test_printf_stderr("Warning ignored command-line argument %d: %s\n", + test_printf_stderr("Warning ignored command-line argument %zu: %s\n", i, args[i+1]); if (i < arg_count) test_printf_stderr("Warning arguments %zu and later unchecked\n", i); diff --git a/test/testutil/output.h b/test/testutil/output.h index 655176f4fe..e637c7bd4b 100644 --- a/test/testutil/output.h +++ b/test/testutil/output.h @@ -10,8 +10,25 @@ #ifndef HEADER_TU_OUTPUT_H # define HEADER_TU_OUTPUT_H -#include +# include +# define ossl_test__attr__(x) +# if defined(__GNUC__) && defined(__STDC_VERSION__) \ + && !defined(__APPLE__) + /* + * Because we support the 'z' modifier, which made its appearance in C99, + * we can't use __attribute__ with pre C99 dialects. + */ +# if __STDC_VERSION__ >= 199901L +# undef ossl_test__attr__ +# define ossl_test__attr__ __attribute__ +# if __GNUC__*10 + __GNUC_MINOR__ >= 44 +# define ossl_test__printf__ __gnu_printf__ +# else +# define ossl_test__printf__ __printf__ +# endif +# endif +# endif /* * The basic I/O functions used internally by the test framework. These * can be overridden when needed. Note that if one is, then all must be. @@ -19,14 +36,21 @@ void test_open_streams(void); void test_close_streams(void); /* The following ALL return the number of characters written */ -int test_vprintf_stdout(const char *fmt, va_list ap); -int test_vprintf_stderr(const char *fmt, va_list ap); +int test_vprintf_stdout(const char *fmt, va_list ap) + ossl_test__attr__((__format__(ossl_test__printf__, 1, 0))); +int test_vprintf_stderr(const char *fmt, va_list ap) + ossl_test__attr__((__format__(ossl_test__printf__, 1, 0))); /* These return failure or success */ int test_flush_stdout(void); int test_flush_stderr(void); /* Commodity functions. There's no need to override these */ -int test_printf_stdout(const char *fmt, ...); -int test_printf_stderr(const char *fmt, ...); +int test_printf_stdout(const char *fmt, ...) + ossl_test__attr__((__format__(ossl_test__printf__, 1, 2))); +int test_printf_stderr(const char *fmt, ...) + ossl_test__attr__((__format__(ossl_test__printf__, 1, 2))); + +# undef ossl_test__printf__ +# undef ossl_test__attr__ #endif /* HEADER_TU_OUTPUT_H */ -- cgit v1.2.3