sim: Suppress non-literal printf warning
authorTsukasa OI <research_trasio@irq.a4lg.com>
Thu, 6 Oct 2022 06:43:51 +0000 (06:43 +0000)
committerAndrew Burgess <aburgess@redhat.com>
Tue, 11 Oct 2022 14:18:14 +0000 (15:18 +0100)
Clang generates a warning if the format string of a printf-like function is
not a literal ("-Wformat-nonliteral"). On the default configuration, it
causes a build failure (unless "--disable-werror" is specified).

To avoid this warning, this commit now uses vsnprintf to format error
message and pass the message to sim_engine_abort function with another
printf-style formatting.

This patch is mostly authored by Andrew Burgess and slightly modified by
Tsukasa OI.

Co-authored-by: Andrew Burgess <aburgess@redhat.com>
Signed-off-by: Tsukasa OI <research_trasio@irq.a4lg.com>
sim/common/hw-device.h
sim/common/sim-hw.c

index 7a36f2f518c34272880dc454aca03b1d31e0802f..451f88723deba313b1bd4d3198116d6ee12d12b4 100644 (file)
@@ -437,10 +437,8 @@ void hw_abort
  const char *fmt,
  ...) ATTRIBUTE_PRINTF (2, 3) ATTRIBUTE_NORETURN;
 
-void hw_vabort
-(struct hw *me,
- const char *fmt,
- va_list ap) ATTRIBUTE_NORETURN;
+extern void hw_vabort (struct hw *me, const char *fmt, va_list ap)
+  ATTRIBUTE_NORETURN ATTRIBUTE_PRINTF (2, 0);
 
 void hw_halt
 (struct hw *me,
index cece5638bc92df891142a5b7bf03decf687777f7..7bfe91e4ae2ce0e0b7f205ce5e647f07278c42ef 100644 (file)
@@ -408,8 +408,11 @@ hw_vabort (struct hw *me,
           const char *fmt,
           va_list ap)
 {
+  int len;
   const char *name;
   char *msg;
+  va_list cpy;
+
   /* find an identity */
   if (me != NULL && hw_path (me) != NULL && hw_path (me) [0] != '\0')
     name = hw_path (me);
@@ -419,16 +422,19 @@ hw_vabort (struct hw *me,
     name = hw_family (me);
   else
     name = "device";
-  /* construct an updated format string */
-  msg = alloca (strlen (name) + strlen (": ") + strlen (fmt) + 1);
-  strcpy (msg, name);
-  strcat (msg, ": ");
-  strcat (msg, fmt);
+
+  /* Expand FMT and AP into MSG buffer.  */
+  va_copy (cpy, ap);
+  len = vsnprintf (NULL, 0, fmt, cpy) + 1;
+  va_end (cpy);
+  msg = alloca (len);
+  vsnprintf (msg, len, fmt, ap);
+
   /* report the problem */
-  sim_engine_vabort (hw_system (me),
-                    STATE_HW (hw_system (me))->cpu,
-                    STATE_HW (hw_system (me))->cia,
-                    msg, ap);
+  sim_engine_abort (hw_system (me),
+                   STATE_HW (hw_system (me))->cpu,
+                   STATE_HW (hw_system (me))->cia,
+                   "%s: %s", name, msg);
 }
 
 void