[PATCH] tests-mbwc: Silence gcc 14 -Werror=format-overflow=

Stefan Liebler stli@linux.ibm.com
Wed Jun 26 12:37:46 GMT 2024


With gcc 14, I get this warning/werror when building the localedata tests:
tests-mbwc/tsp_common.c: In function ‘result.constprop.isra’:
tests-mbwc/tsp_common.c:55:43: error: ‘%s’ directive writing up to 92 bytes into a region of size between 0 and 114 [-Werror=format-overflow=]
   55 |   sprintf (result_rec, "%s:%s:%d:%d:%d:%c:%s\n", func, loc, rec_no, seq_no,
      |                                           ^~
In file included from ../include/bits/stdio2.h:1,
                 from ../libio/stdio.h:980,
                 from ../include/stdio.h:14,
                 from tests-mbwc/tsp_common.c:10:
In function ‘sprintf’,
    inlined from ‘result.constprop.isra’ at tests-mbwc/tsp_common.c:55:3:
../libio/bits/stdio2.h:30:10: note: ‘__builtin___sprintf_chk’ output between 20 and 234 bytes into a destination of size 132
   30 |   return __builtin___sprintf_chk (__s, __USE_FORTIFY_LEVEL - 1,
      |          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   31 |                                   __glibc_objsize (__s), __fmt,
      |                                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   32 |                                   __va_arg_pack ());
      |                                   ~~~~~~~~~~~~~~~~~
cc1: all warnings being treated as errors

This patch is now using snprintf to determine if we should fallback to stderr
or output to fp.  The handling of the return-value of snprintf silences the
warning.
---
 localedata/tests-mbwc/tsp_common.c | 6 ++----
 1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/localedata/tests-mbwc/tsp_common.c b/localedata/tests-mbwc/tsp_common.c
index cd88274c57..f09cdaf511 100644
--- a/localedata/tests-mbwc/tsp_common.c
+++ b/localedata/tests-mbwc/tsp_common.c
@@ -44,7 +44,8 @@ result (FILE * fp, char res, const char *func, const char *loc, int rec_no,
 	int seq_no, int case_no, const char *msg)
 {
   if (fp == NULL
-      || strlen (func) + strlen (loc) + strlen (msg) + 32 > MAX_RESULT_REC)
+      || snprintf (result_rec, MAX_RESULT_REC, "%s:%s:%d:%d:%d:%c:%s\n", func,
+		   loc, rec_no, seq_no, case_no, res, msg) >= MAX_RESULT_REC)
     {
       fprintf (stderr,
 	       "Warning: result(): can't write the result: %s:%s:%d:%d:%s\n",
@@ -52,9 +53,6 @@ result (FILE * fp, char res, const char *func, const char *loc, int rec_no,
       return 0;
     }
 
-  sprintf (result_rec, "%s:%s:%d:%d:%d:%c:%s\n", func, loc, rec_no, seq_no,
-	   case_no, res, msg);
-
   if (fputs (result_rec, fp) == EOF)
     {
       return 0;
-- 
2.45.0



More information about the Libc-alpha mailing list