Переглянути джерело

Add a format attribute to the format functions and fix the broken format
strings.

Reviewed-by: Richard Levitte <levitte@openssl.org>

Reviewed-by: Viktor Dukhovni <viktor@openssl.org>

Christos Zoulas 5 роки тому
батько
коміт
ec91206fbe
3 змінених файлів з 38 додано та 14 видалено
  1. 8 8
      test/testutil/format_output.c
  2. 1 1
      test/testutil/main.c
  3. 29 5
      test/testutil/output.h

+ 8 - 8
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;

+ 1 - 1
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);

+ 29 - 5
test/testutil/output.h

@@ -10,8 +10,25 @@
 #ifndef HEADER_TU_OUTPUT_H
 # define HEADER_TU_OUTPUT_H
 
-#include <stdarg.h>
+# include <stdarg.h>
 
+# 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 */