app/flow-perf: fix build with GCC 12
authorDavid Marchand <david.marchand@redhat.com>
Wed, 18 May 2022 10:16:56 +0000 (12:16 +0200)
committerDavid Marchand <david.marchand@redhat.com>
Wed, 15 Jun 2022 08:21:19 +0000 (10:21 +0200)
GCC 12 raises the following warning:

../app/test-flow-perf/main.c: In function ‘start_forwarding’:
../app/test-flow-perf/main.c:1737:28: error: ‘sprintf’ may write a
    terminating nul past the end of the destination
    [-Werror=format-overflow=]
 1737 |         sprintf(p[i++], "%d", (int)n);
      |                            ^
In function ‘pretty_number’,
    inlined from ‘packet_per_second_stats’ at
        ../app/test-flow-perf/main.c:1792:4,
    inlined from ‘start_forwarding’ at
        ../app/test-flow-perf/main.c:1831:3:
[...]

We can simplify this code and rely on libc integer formatting via
this system locales.

Bugzilla ID: 856
Cc: stable@dpdk.org
Signed-off-by: David Marchand <david.marchand@redhat.com>
Acked-by: Bruce Richardson <bruce.richardson@intel.com>
Acked-by: Stephen Hemminger <stephen@networkplumber.org>
app/test-flow-perf/main.c

index 56d4373..f375097 100644 (file)
@@ -16,6 +16,7 @@
  * gives packet per second measurement.
  */
 
+#include <locale.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -1713,36 +1714,6 @@ do_tx(struct lcore_info *li, uint16_t cnt, uint16_t tx_port,
                rte_pktmbuf_free(li->pkts[i]);
 }
 
-/*
- * Method to convert numbers into pretty numbers that easy
- * to read. The design here is to add comma after each three
- * digits and set all of this inside buffer.
- *
- * For example if n = 1799321, the output will be
- * 1,799,321 after this method which is easier to read.
- */
-static char *
-pretty_number(uint64_t n, char *buf)
-{
-       char p[6][4];
-       int i = 0;
-       int off = 0;
-
-       while (n > 1000) {
-               sprintf(p[i], "%03d", (int)(n % 1000));
-               n /= 1000;
-               i += 1;
-       }
-
-       sprintf(p[i++], "%d", (int)n);
-
-       while (i--)
-               off += sprintf(buf + off, "%s,", p[i]);
-       buf[strlen(buf) - 1] = '\0';
-
-       return buf;
-}
-
 static void
 packet_per_second_stats(void)
 {
@@ -1764,7 +1735,6 @@ packet_per_second_stats(void)
                uint64_t total_rx_pkts = 0;
                uint64_t total_tx_drops = 0;
                uint64_t tx_delta, rx_delta, drops_delta;
-               char buf[3][32];
                int nr_valid_core = 0;
 
                sleep(1);
@@ -1789,10 +1759,8 @@ packet_per_second_stats(void)
                        tx_delta    = li->tx_pkts  - oli->tx_pkts;
                        rx_delta    = li->rx_pkts  - oli->rx_pkts;
                        drops_delta = li->tx_drops - oli->tx_drops;
-                       printf("%6d %16s %16s %16s\n", i,
-                               pretty_number(tx_delta,    buf[0]),
-                               pretty_number(drops_delta, buf[1]),
-                               pretty_number(rx_delta,    buf[2]));
+                       printf("%6d %'16"PRId64" %'16"PRId64" %'16"PRId64"\n",
+                               i, tx_delta, drops_delta, rx_delta);
 
                        total_tx_pkts  += tx_delta;
                        total_rx_pkts  += rx_delta;
@@ -1803,10 +1771,9 @@ packet_per_second_stats(void)
                }
 
                if (nr_valid_core > 1) {
-                       printf("%6s %16s %16s %16s\n", "total",
-                               pretty_number(total_tx_pkts,  buf[0]),
-                               pretty_number(total_tx_drops, buf[1]),
-                               pretty_number(total_rx_pkts,  buf[2]));
+                       printf("%6s %'16"PRId64" %'16"PRId64" %'16"PRId64"\n",
+                               "total", total_tx_pkts, total_tx_drops,
+                               total_rx_pkts);
                        nr_lines += 1;
                }
 
@@ -2139,6 +2106,9 @@ main(int argc, char **argv)
        if (argc > 1)
                args_parse(argc, argv);
 
+       /* For more fancy, localised integer formatting. */
+       setlocale(LC_NUMERIC, "");
+
        init_port();
 
        nb_lcores = rte_lcore_count();